我有一个从我使用的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"?
这是我想要实现的流程。
我不知道这是否是最好的方式,我真的很感激输入,也许这是一种更简单的方法。
提前致谢, 最好的问候,
Stefan Konno
答案 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"))}