Предположим, мы получили следующую настройку (я использую Цирцея-литерала для удобства, но ваши 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 массивы-если вы хотите, чтобы открыть вопрос, мы можем сделать некоторые больше думать об этом.