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

时间:2018-08-29 14:52:38

标签: json algorithm scala json4s

在任何人将其标记为重复之前,我已经检查了以下问题: 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将被合并为一个,它们可能具有嵌套的复杂结构,如数组和对象。

这里的合并意味着在重复的节点上向现有数据添加而不覆盖它们,如上例所示。

我也考虑过使用树,但是在那里没有太多进展。

1 个答案:

答案 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"
  }]
}