Слияние / объединение JSON на дублирующих узлах с использованием JSON4S - PullRequest
0 голосов
/ 29 августа 2018

Прежде чем кто-либо пометит это как дубликат, я уже проверил этот вопрос: Удалить дубликаты и объединить объекты JSON . (скопированный пример оттуда)

Я работаю над делом, которое включает слияние 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 голосов
/ 02 июля 2019

Вы можете использовать операцию 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"
  }]
}
...