Игра: Как удалить поля без значения из JSON и создать с ними новый JSON

Учитывая следующий JSON:

{
  "field1": "value1",
  "field2": "",
  "field3": "value3",
  "field4": ""
}

Как мне получить два разных JSON, один из которых содержит поля со значением, а другой — поля без значения? Ниже показано, как должен выглядеть окончательный результат:

{
  "field1": "value1",
  "field3": "value3"
}

{
  "field2": "",
  "field4": ""
}

person j3d    schedule 01.07.2014    source источник
comment
а просто зациклиться и построить два новых объекта недостаточно?   -  person bsoist    schedule 01.07.2014


Ответы (3)


У вас есть доступ к полям объекта JSON в виде последовательности пар (String, JsValue), и вы можете фильтровать их. Вы можете отфильтровать объекты со значением и без него и использовать отфильтрованные последовательности для создания новых JsObject объектов.

import play.api.libs.json._

val ls =
  ("field1", JsString("value1")) ::
  ("field2", JsString("")) ::
  ("field3", JsString("value3")) ::
  ("field4", JsString("")) ::
  Nil

val js0 = new JsObject(ls)

def withoutValue(v: JsValue) = v match {
  case JsNull => true
  case JsString("") => true
  case _ => false
}

val js1 = JsObject(js0.fields.filterNot(t => withoutValue(t._2)))
val js2 = JsObject(js0.fields.filter(t => withoutValue(t._2)))
person nietaki    schedule 01.07.2014

Вы можете улучшить решение @nietaki, используя функцию разделения.

import play.api.libs.json._

val ls =
  ("field1", JsString("value1")) ::
    ("field2", JsString("")) ::
    ("field3", JsString("value3")) ::
    ("field4", JsString("")) ::
    Nil

val js0 = new JsObject(ls)

def withoutValue(v: JsValue) = v match {
  case JsNull => true
  case JsString("") => true
  case _ => false
}

val (js1, js2) = js0.fields.partition(t => withoutValue(t._2))
JsObject(js1)
JsObject(js2)
person Przemek    schedule 02.07.2014

Вы также можете сделать это в одном лайнере:

val (js1, js2) = j.fields.partition(_._2 != JsString(""))
println(JsObject(js1))
println(JsObject(js2))

Код запускается по адресу Scastie.

person Tomer Shetah    schedule 10.12.2020