Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/algorithm/10.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
使用JSON4S在重复节点上合并/组合JSON_Json_Algorithm_Scala_Json4s - Fatal编程技术网

使用JSON4S在重复节点上合并/组合JSON

使用JSON4S在重复节点上合并/组合JSON,json,algorithm,scala,json4s,Json,Algorithm,Scala,Json4s,在任何人将其标记为重复之前,我已经检查了这个问题: . (从那里复制示例) 我正在处理一个涉及合并json的案例,如下面的示例所示 [{ "id" : 1, "name" : "abc", "nodes" :[ { "nodeId" : 20, "nodeName" : "test1" } ] }, {

在任何人将其标记为重复之前,我已经检查了这个问题: . (从那里复制示例)

我正在处理一个涉及合并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项目,有1000个json要合并成一个,它们可能有嵌套的complext结构,比如数组和对象

这里的合并意味着添加到重复节点上预先存在的数据,而不是覆盖它们,如上面的示例所示


我也考虑过使用树,但进展不大。

您可以使用
合并操作:

def main(args:Array[String]):单位={
val json=“”[{
|“id”:1,
|“名称”:“abc”,
|“节点”:[
|            {
|“nodeId”:20,
|“节点名称”:“test1”
|            }
|        ]
|    },
|    {
|“id”:1,
|“名称”:“abc”,
|“节点”:[
|            {
|“nodeId”:21,
|“nodeName”:“test2”
|            }
|        ]
|}]“”。条边距
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"
  }]
}

您需要更清楚地了解您想要进行的处理。“重复节点”和“合并”是什么意思。要使两个节点重复,哪些数据必须相同?合并哪些数据以及如何合并?如果两个顶级对象是相同的呢?重复节点意味着相同深度级别上的公共关键点。合并策略如示例所示。合并应该从根节点到端节点进行。如果top键是公共的,则保留该键并检查子节点