2016-04-14 7 views
2

2つのjson配列があるとします。 circeを使ってそれらを1つの配列にマージするには?例:複数のjson配列をサークルに結合する

アレイ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

我々は、以下のセットアップ(私は便宜上キルケリテラルを使用していますが、あなたの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の現在の契約は、次のように述べている:

ヌル、配列、ブール、文字列や数値を値として扱われ、引数のJSONの値は、完全にこのJSONから値を置き換えます。

これはしかし、石に設定されていない、とあなたはそれについて考え、我々はいくつかのより多く行うことができ、問題を開きたい場合は配列、deepMerge CONCATENATEのJSONを持ってするのは無理ではないかもしれません。