6

我有这个从我正在使用的 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 结果来更改属性“值”?

这是我想要实现的流程。

  1. 将 JSON 解析为可迭代对象
  2. 循环并查找某些“名称”并将其值(例如 fstname)从 John 更改为其他名称。
  3. 将其解析回 JSON,因此我可以将带有更新值的新 JSON 发送回来。

我不知道这是否是最好的方法,我真的很感激输入,也许有更简单的方法来做到这一点。

在此先感谢,最好的问候,

斯蒂芬·康诺

4

1 回答 1

6

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

case class Field(`type`: String, name: String, value: String)

您可以将您的 json 转换为字段数组,例如read[Array[Field]](json)json 所在的位置

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

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

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

之后,要将对象数组转换为 Json,您可以简单地使用 write(objects)(Json4s 的读写功能在 package.json 中提供)org.json4s.native.Serialization

Update 

要做到这一点而不将其转换为案例类,您可以使用 transformField 函数

parse(json).transformField{case JField(x, v) if x == "value" && v == JString("Company")=> JField("value1",JString("Company1"))}
于 2015-01-13T13:59:02.503 回答