6

假设我们有 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了,但它只保留参数的内容,而不是调用对象的内容。

4

1 回答 1

10

假设我们有以下设置(为方便起见,我使用 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]代表NoneJSON数组。例如,您可以决定在这种情况下要发生什么,或者可能是合理的选择。a1a2.getOrElse(a2).getOrElse(a1.deepMerge(a2))

作为旁注,当前的合同规定deepMerge如下:

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

不过,这并不是一成不变的,deepMerge连接 JSON 数组可能不是不合理的——如果你想打开一个问题,我们可以做更多的思考。

于 2016-04-14T14:31:59.917 回答