播放:如何从JSON中删除没有值的字段并使用它们创建新的JSON

j3d*_*j3d 5 json scala playframework

鉴于以下JSON ......

{
  "field1": "value1",
  "field2": "",
  "field3": "value3",
  "field4": ""
}
Run Code Online (Sandbox Code Playgroud)

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

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

{
  "field2": "",
  "field4": ""
}
Run Code Online (Sandbox Code Playgroud)

nie*_*aki 6

您可以将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)))
Run Code Online (Sandbox Code Playgroud)


Prz*_*mek 6

您可以使用分区功能改进@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)
Run Code Online (Sandbox Code Playgroud)