2016-04-14 5 views
2

Предположим, у нас есть 2 массива json. Как объединить их в один массив с циркой? Пример:Слить несколько 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) 

Оба этих подхода собираются чтобы дать вам Option[Json], который будет None, если a1 или a2 не представляют собой массивы JSON. Вам решать, что вы хотите в этой ситуации, например, .getOrElse(a2) или .getOrElse(a1.deepMerge(a2)).

В качестве примечания, текущий договор deepMerge говорит следующее:

Null, Массив, Boolean, String и Number рассматриваются как значения и значения из аргумента JSON полностью заменить значения из этого JSON ,

Это не высечены на камне, хотя, и это не может быть неразумно иметь deepMerge конкатенации JSON массивы-если вы хотите, чтобы открыть вопрос, мы можем сделать некоторые больше думать об этом.

 Смежные вопросы

  • Нет связанных вопросов^_^