Синтаксический анализ и управление json в Scala

у меня есть этот JSON, который возвращается из службы REST, которую я использую.

{
    "id": "6804",
    "signatories": [
        {
            "id": "12125",
            "fields": [
                {
                    "type": "standard",
                    "name": "fstname",
                    "value": "John"
                },
                {
                    "type": "standard",
                    "name": "sndname",
                    "value": "Doe"
                },
                {
                    "type": "standard",
                    "name": "email",
                    "value": "john.doe@somwhere.com"
                },
                {
                    "type": "standard",
                    "name": "sigco",
                    "value": "Company"
                }
            ]
        }
    ]
}

В настоящее время я ищу способ проанализировать это с помощью json4s, повторяя массив "fields", чтобы иметь возможность изменять свойство "value" различных объектов. До сих пор я пробовал несколько JSON libs и закончил с json4s.

Json4s позволяет мне анализировать json в JObject, который я могу попробовать извлечь массив " fields от.

    import org.json4s._
    import org.json4s.native.JsonMethods._

    // parse to JObject
    val data = parse(json)

    // extract the fields into a map
    val fields = data  "signatories"  "fields"

    // parse back to JSON
    println(compact(render(fields)))

мне удалось извлечь такую карту и снова отобразить ее в JSON. Однако я не могу понять, как пройти через эти поля и изменить свойство "значение" в них?

Я прочитал документацию json4s, но я очень новичок в Scala,и это синтаксис, поэтому мне трудно.

возникает вопрос: Как выполнить итерацию по проанализированному результату JSON, чтобы изменить свойство "value"?

вот поток Я хочу достичь.

  1. разобрать JSON на iterable object
  2. выполните цикл и найдите определенные "имена" и измените их значение, например fstname, с John на другое имя.
  3. проанализируйте его обратно в JSON, чтобы я мог отправить новый JSON с обновленными значениями.

Я не знаю, если это лучший способ сделать это вообще, я бы очень признателен за вклад, может быть, есть более простой способ сделать это.

спасибо продвижение, С наилучшими пожеланиями,

Стефан Конно

1 ответов


вы можете преобразовать json в массив класса case, что является самым простым делом. Например: у вас может быть класс case для таких полей, как

case class Field(`type`: String, name: String, value: String)

и вы можете преобразовать свой json в массив полей, таких как read[Array[Field]](json) где json

 [
            {
                "type": "standard",
                "name": "fstname",
                "value": "John"
            },
            ...
        ]

который даст вам массив полей. Аналогично, вы можете моделировать для всего своего Json.

как теперь у вас есть массив классов case, его довольно просто перебирать объекты и изменять значение с помощью case classes copy метод.

после этого, чтобы преобразовать массив объектов в JSON, вы можете просто использовать write(objects) (функции чтения и записи Json4s доступны в org.json4s.native.Serialization пакета.

Update 

чтобы сделать это без преобразования его в класс case, вы можете использовать функцию transformField

parse(json).transformField{case JField(x, v) if x == "value" && v == JString("Company")=> JField("value1",JString("Company1"))}