合并几个json数组

时间:2016-04-14 13:55:21

标签: json scala circe

我们说我们有2个json数组。如何将它们合并为一个带有circe的单个数组?例如:

数组1:

[{"id": 1}, {"id": 2}, {"id": 3}]

数组2:

[{"id": 4}, {"id": 5}, {"id": 6}]

需要:

[{"id": 1}, {"id": 2}, {"id": 3}, {"id": 4}, {"id": 5}, {"id": 6}]

我已尝试deepMerge,但它只保留参数的内容,而不是调用对象的内容。

1 个答案:

答案 0 :(得分:5)

假设我们已经进行了以下设置(为方便起见,我使用circe-literal,但您的Json值可能来自任何地方):

import io.circe.Json, io.circe.literal._

val a1: Json = json"""[{"id": 1}, {"id": 2}, {"id": 3}]"""
val a2: Json = json"""[{"id": 4}, {"id": 5}, {"id": 6}]"""

现在我们可以将它们组合起来:

for { a1s <- a1.asArray; a2s <- a2.asArray } yield Json.fromValues(a1s ++ a2s)

或者:

import cats.std.option._, cats.syntax.cartesian._

(a1.asArray |@| a2.asArray).map(_ ++ _).map(Json.fromValues)

如果Option[Json]None代表JSON数组,这两种方法都会为a1提供a2。例如,由您决定在这种情况下您希望发生什么.getOrElse(a2).getOrElse(a1.deepMerge(a2))可能是合理的选择。

作为附注,deepMerge的当前合同说明如下:

  

Null,Array,Boolean,String和Number被视为值,参数JSON中的值完全替换此JSON中的值。

但是,这并不是一成不变的,让deepMerge连接JSON数组可能并不合理 - 如果你想打开一个问题我们可以多考虑​​一下。