Изменение массива JSON в Scala с помощью circe - PullRequest
0 голосов
/ 07 октября 2018

У меня есть строка JSON с массивом, как показано ниже:

{
"cars": {
    "Nissan": [
        {"model":"Sentra", "doors":4},
        {"model":"Maxima", "doors":4}
    ],
    "Ford": [
        {"model":"Taurus", "doors":4},
        {"model":"Escort", "doors":2}
    ]
}
}

Я хотел бы отредактировать новый бренд карты, используя circe в scala.
Вместо

"Nissan": [
        {"model":"Sentra", "doors":4},
        {"model":"Maxima", "doors":4},
    ]

Я хотел бы получить в результате:

"Nissan": [
        {"model":"Sentra", "doors":1000},
    ],

Спасибо.

1 Ответ

0 голосов
/ 08 октября 2018

Сделано после прочтения руководства , пожалуйста, сделайте то же самое в следующий раз!

Кроме того, что ваш 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и не нужно иметь дело с вложенными типами ( см. здесь ).

...