在任何人将其标记为重复之前,我已经检查了以下问题: Remove duplicates and merge JSON objects。 (从那里复制的示例)
我正在处理一个涉及合并json的案例,如下例所示,
[{
"id" : 1,
"name" : "abc",
"nodes" :[
{
"nodeId" : 20,
"nodeName" : "test1"
}
]
},
{
"id" : 1,
"name" : "abc",
"nodes" :[
{
"nodeId" : 21,
"nodeName" : "test2"
}
]
}]
直到叶节点,
[{
"id" : 1,
"name" : "abc",
"nodes" :[
{
"nodeId" : 20,
"nodeName" : "test1"
},
{
"nodeId" : 21,
"nodeName" : "test2"
},
]
}]
通过递归比较节点并手动合并到对象中并最终转换为json字符串,我可以使用蛮力方法。我想知道是否有使用json4s的更好方法。 更多的上下文,这是一个scala项目,有成千上万的json将被合并为一个,它们可能具有嵌套的复杂结构,如数组和对象。
这里的合并意味着在重复的节点上向现有数据添加而不覆盖它们,如上例所示。
我也考虑过使用树,但是在那里没有太多进展。
答案 0 :(得分:0)
您可以使用merge
操作:
def main(args: Array[String]): Unit = {
val json = """[{
| "id" : 1,
| "name" : "abc",
| "nodes" :[
| {
| "nodeId" : 20,
| "nodeName" : "test1"
| }
| ]
| },
| {
| "id" : 1,
| "name" : "abc",
| "nodes" :[
| {
| "nodeId" : 21,
| "nodeName" : "test2"
| }
| ]
| }]""".stripMargin
val jsonArray = parse(json).asInstanceOf[JArray]
val res = jsonArray.arr.reduceLeft{(x,y) => x merge y}
println(pretty(render(res)))
}
哪个输出:
{
"id":1,
"name":"abc",
"nodes":[{
"nodeId":20,
"nodeName":"test1"
},{
"nodeId":21,
"nodeName":"test2"
}]
}