在 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"?
这是我想要实现的流程。
- 将JSON解析为可迭代对象
- 循环查找某些 "names" 并更改它们的值,例如 fstname,从 John 更改为其他名称。
- 将其解析回 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"))}
我有一个从我正在使用的 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"?
这是我想要实现的流程。
- 将JSON解析为可迭代对象
- 循环查找某些 "names" 并更改它们的值,例如 fstname,从 John 更改为其他名称。
- 将其解析回 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"))}