Добавление поля в json с помощью Circe

Я просматриваю документацию Circe и не могу понять, как справиться со следующим.

Я просто хотел бы добавить поле с объектом в указанный основной объект JSON.

{
  Fieldalreadythere: {}
  "Newfield" : {}
}

Я просто хочу добавить Newfield в объект. Чтобы дать немного контекста, я имею дело с Json-ld. Я просто хочу добавить объект контекста. @context: {} См. пример ниже:

{
  "@context": {
    "@version": 1.1,
    "xsd": "http://www.w3.org/2001/XMLSchema#",
    "foaf": "http://xmlns.com/foaf/0.1/",
    "foaf:homepage": { "@type": "@id" },
    "picture": { "@id": "foaf:depiction", "@type": "@id" }
  },
  "@id": "http://me.markus-lanthaler.com/",
  "@type": "foaf:Person",
  "foaf:name": "Markus Lanthaler",
  "foaf:homepage": "http://www.markus-lanthaler.com/",
  "picture": "http://twitter.com/account/profile_image/markuslanthaler"
}

Я бы хотел добавить объект контекста, вот и все.

Как я могу это сделать с помощью Circe. Пример в официальной документации в основном говорит об изменении значения, но не о добавлении поля и так далее.


person MaatDeamon    schedule 08.12.2018    source источник


Ответы (2)


Взгляните на JsonObject. Существует : +, который делает то, что вы хотите.

Вот простой пример:

import io.circe.generic.auto._
import io.circe.parser
import io.circe.syntax._

object CirceAddFieldExample extends App {
    val jsonStr = """{
       Fieldalreadythere: {}
    }"""
    val json = parser.parse(jsonStr)
    val jsonObj = json match {
       case Right(value) => value.asObject
       case Left(error) => throw error
    }
    val jsonWithContextField = jsonObj.map(_.+:("@context", contextObj.asJson))
}
person Tarang Bhalodia    schedule 08.12.2018

Вы можете использовать метод deepMerge, чтобы сложить два Json вместе.

Предполагая, что для вашего класса контекста доступен кодировщик:

val contextJson: Json = Map("@context" -> context).asJson
val result: Json = existingJson.deepMerge(contextJson)
person Callum    schedule 22.01.2019
comment
Карта (@context - ›context) .asJson - person Konstantin Bodnia; 23.07.2020