在 Scala 中解析和操作 json

Parsing and manipulating json in Scala

我有一个从我正在使用的 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 解析它,遍历 "fields" 数组,以便能够更改 属性 "value"那里的不同对象。到目前为止,我已经尝试了几个 json 库并以 json4s 结束。

Json4s 允许我将 json 解析为 JObject,我可以尝试提取 "fields" 数组 从。

    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。我想不通的是,如何遍历这些字段并更改其中的 属性 "value"?

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

问题就变成了,我如何遍历已解析的 JSON 结果,以更改 属性 "value"?

这是我想要实现的流程。

  1. 将JSON解析为可迭代对象
  2. 循环查找某些 "names" 并更改它们的值,例如 fstname,从 John 更改为其他名称。
  3. 将其解析回 JSON,这样我就可以发送新的 JSON 和更新后的值。

我不知道这是否是最好的方法,非常感谢您提供意见,也许有更简单的方法。

提前致谢, 最好的问候,

Stefan Konno

您可以将 json 转换为大小写数组 class,这是最简单的方法。例如:对于

这样的字段,您可以使用 class 大小写
case class Field(`type`: String, name: String, value: String)

并且您可以将 json 转换为字段数组,例如 read[Array[Field]](json),其中 json 是

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

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

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

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

Update 

不转换大小写class,可以使用transformField函数

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