使用Jackson将多个JsonNode合并到一个数组中

时间:2018-10-22 12:59:45

标签: json scala jackson

我需要编写一些添加器方法,将“ JsonNode”对象添加在一起。 最后,这将在数百次迭代中递归运行。 最终,我将其转换为Avro对象。因此,除了“只是使其正常工作”之外,我还想将内存消耗考虑在内。

下面是一个简化的示例:

  val s1 = """{"condition": "yes",
    "id": "file",
    "value": "File" }"""

  val s2 = """{"condition": "no",
    "id": "file2",
    "value": "File2" }"""

  val mapper = new ObjectMapper()

  val obj1: JsonNode = mapper.readTree(s1)
  val obj2: JsonNode = mapper.readTree(s2)

  // the following doesn't work obviously, but that's what I'm trying to do
  val result = obj1 + obj2
  println(result.toString)

所需的输出将是:

[{"condition": "yes",
    "id": "file",
    "value": "File" },
 {"condition": "no",
    "id": "file2",
    "value": "File2" }]

我一直在摆弄一些选项,但似乎无法轻松进行添加。除非我当然走了“字符串”路线,但这并不像我希望的那样干净。 (将s1和s2附加,并用[]括起来)

1 个答案:

答案 0 :(得分:1)

正如@yokomizor所说,您需要使用两个元素obj1obj2构建一个ArrayNode

val result: ArrayNode = mapper.createArrayNode()
result.add(obj1)
result.add(obj2)

或更简单:

val result: ArrayNode = mapper.createArrayNode().add(obj1).add(obj2)

它的额外内存占用空间尽可能小, 因为internal implementation of ArrayNode 只是有一个private List<JsonNode> _children, 并且您已经有JsonNode个内存在内存中了。