Добавление элементов в массив JSON с использованием circe и scala - PullRequest
0 голосов
/ 06 октября 2018

У меня есть строка JSON:

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

Я хотел бы добавить новую марку автомобилей (в дополнение к Nissan и Ford ), используя circe в Scala.
Как я могу это сделать?

Заранее спасибо.

1 Ответ

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

Вы можете изменить JSON, используя курсоры .Одно из возможных решений:

import io.circe._, io.circe.parser._

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

val carsJson = parse(cars).getOrElse(Json.Null)
val teslaJson: Json = parse("""
    {
      "Tesla": [
        {"model":"Model X", "doors":5}
      ]
    }""").getOrElse(Json.Null)

val carsCursor = carsJson.hcursor
val newJson = carsCursor.downField("cars").withFocus(_.deepMerge(teslaJson)).top

Здесь мы просто перейдем к полю cars , "сфокусируемся" на нем и передадим функцию для изменения значений JSON.Здесь используется deepMerge.

newJson будет выглядеть следующим образом:

Some({
  "cars" : {
    "Tesla" : [
      {
        "model" : "Model X",
        "doors" : 5
      }
    ],
    "Nissan" : [
      {
        "model" : "Sentra",
        "doors" : 4
      },
      {
        "model" : "Maxima",
        "doors" : 4
      },
      {
        "model" : "Skyline",
        "doors" : 2
      }
    ],
    "Ford" : [
      {
        "model" : "Taurus",
        "doors" : 4
      },
      {
        "model" : "Escort",
        "doors" : 4
      }
    ]
  }
})
...