在Scala中解析和操纵json

时间:2015-01-13 13:43:16

标签: json scala json4s

我有一个从我使用的REST服务返回的JSON。

{
    "id": "6804",
    "signatories": [
        {
            "id": "12125",
            "fields": [
                {
                    "type": "standard",
                    "name": "fstname",
                    "value": "John"
                },
                {
                    "type": "standard",
                    "name": "sndname",
                    "value": "Doe"
                },
                {
                    "type": "standard",
                    "name": "email",
                    "value": "john.doe@somwhere.com"
                },
                {
                    "type": "standard",
                    "name": "sigco",
                    "value": "Company"
                }
            ]
        }
    ]
}

目前我正在研究用json4s解析这个问题的方法,迭代"字段"数组,能够改变属性"值"在那里的不同对象。到目前为止,我已经尝试了一些json库,最后得到了json4s

Json4s允许我将json解析为JObject,我可以尝试提取"字段"排列 从。

    import org.json4s._
    import org.json4s.native.JsonMethods._

    // parse to JObject
    val data = parse(json)

    // extract the fields into a map
    val fields = data \ "signatories" \ "fields"

    // parse back to JSON
    println(compact(render(fields)))

我设法提取了这样的地图,并再次将其渲染回JSON。我无法弄清楚的是,如何遍历这些字段并更改属性"值"在他们中?

我已经阅读了json4s文档,但我对Scala和它的语法都很陌生,所以我很难过。

问题变成了,如何迭代解析的JSON结果,更改属性" value"?

这是我想要实现的流程。

  1. 将JSON解析为可迭代对象
  2. 循环查找某些"名称"并将其值(例如fstname)从John更改为其他名称。
  3. 将其解析回JSON,这样我就可以发送带有更新值的新JSON。
  4. 我不知道这是否是最好的方式,我真的很感激输入,也许这是一种更简单的方法。

    提前致谢, 最好的问候,

    Stefan Konno

1 个答案:

答案 0 :(得分:6)

您可以将json转换为case类的数组,这是最简单的事情。例如:您可以为

这样的字段设置案例类
case class Field(`type`: String, name: String, value: String)

你可以将你的json转换为像read[Array[Field]](json)这样的字段数组,其中json是

 [
            {
                "type": "standard",
                "name": "fstname",
                "value": "John"
            },
            ...
        ]

将为您提供一系列字段。同样,您可以为整个Json建模。

现在你有一个case类数组,迭代对象并使用case类copy方法更改值非常简单。

之后,要将对象数组转换为Json,只需使用write(objects)org.json4s.native.Serialization包中可以使用Json4的读写函数。

Update 

要在不将其转换为案例类的情况下执行此操作,您可以使用transformField函数

parse(json).transformField{case JField(x, v) if x == "value" && v == JString("Company")=> JField("value1",JString("Company1"))}