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)

これらのアプローチはどちらも、 JSON 配列を表すか、または表さないかをOption[Json]示します。たとえば、その状況で何が起こりたいか、または合理的な選択であるかを決定するのはあなた次第です。Nonea1a2.getOrElse(a2).getOrElse(a1.deepMerge(a2))

補足として、現在の契約にdeepMergeは次のように記載されています。

Null、Array、Boolean、String、および Number は値として扱われ、引数 JSON の値はこの JSON の値を完全に置き換えます。

deepMergeただし、これは決まったものではなく、 JSON 配列を連結することは不合理ではないかもしれません。

于 2016-04-14T14:31:59.917 に答える