合并几个 json 数组
Merge several json arrays in 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
,但它只保留参数的内容,而不是调用对象的内容。
假设我们有以下设置(为方便起见,我使用 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)
如果 a1
或 a2
不代表 JSON,这两种方法都会为您提供一个 Option[Json]
None
阵列。由您决定在那种情况下想要发生什么 .getOrElse(a2)
或 .getOrElse(a1.deepMerge(a2))
可能是合理的选择,例如。
作为旁注,deepMerge
的当前合同规定如下:
Null, Array, Boolean, String and Number are treated as values, and values from the argument JSON completely replace values from this JSON.
不过,这并不是一成不变的,deepMerge
连接 JSON 数组可能不是不合理的——如果你想打开一个问题,我们可以做更多的思考它。
假设我们有 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
,但它只保留参数的内容,而不是调用对象的内容。
假设我们有以下设置(为方便起见,我使用 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)
如果 a1
或 a2
不代表 JSON,这两种方法都会为您提供一个 Option[Json]
None
阵列。由您决定在那种情况下想要发生什么 .getOrElse(a2)
或 .getOrElse(a1.deepMerge(a2))
可能是合理的选择,例如。
作为旁注,deepMerge
的当前合同规定如下:
Null, Array, Boolean, String and Number are treated as values, and values from the argument JSON completely replace values from this JSON.
不过,这并不是一成不变的,deepMerge
连接 JSON 数组可能不是不合理的——如果你想打开一个问题,我们可以做更多的思考它。