6

给定以下 JSON:

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

如何获得两个不同的 JSON,一个包含有值的字段,另一个包含没有值的字段?下面是最终结果的样子:

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

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

3 回答 3

7

您可以使用分区函数改进@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)
于 2014-07-02T13:39:17.873 回答
7

您可以以成对序列的形式访问 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)))
于 2014-07-01T15:56:55.190 回答
0

你也可以在一个班轮中做到这一点:

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

在Scastie运行的代码

于 2020-12-10T10:05:44.203 回答