Сделано после прочтения руководства , пожалуйста, сделайте то же самое в следующий раз!
Кроме того, что ваш JSON недействителен (конечная запятая для объекта в массиве "Nissan"
) , это должно выглядеть примерно так:
import cats.syntax.either._
import io.circe._, io.circe.parser._
val json: String = """
{
"cars": {
"Nissan": [
{"model":"Sentra", "doors":4},
{"model":"Maxima", "doors":4}
],
"Ford": [
{"model":"Taurus", "doors":4},
{"model":"Escort", "doors":2}
]
}
}
"""
val newJson = parse(json).toOption
.flatMap { doc =>
doc.hcursor
.downField("cars")
.downField("Nissan")
.withFocus(_ =>
Json.arr(
Json.fromFields(
Seq(
("model", Json.fromString("Sentra")),
("doors", Json.fromInt(1000))
)
)
)
)
.top
}
newJson match {
case Some(v) => println(v.toString)
case None => println("Failure!")
}
Попробуйте! (Повторите, чтобы увидеть правильный отступ!)
newJson
на самом делеOption
, поэтому, если синтаксический анализ или изменение завершится неудачно, вы получите None
.
Вызов toOption
на parse(json)
преобразует возвращенный Either[Json]
(анализ выполнен / не выполнен) в Option[Json]
.
Сначала нам нужно использовать Option[Json]
, потому что .top
также возвращает Option[Json]
(изменение выполнено / не удалось).
Таким образом, мы можем flatMap
и не нужно иметь дело с вложенными типами ( см. здесь ).