Синтаксический анализ и управление 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"?
вот поток Я хочу достичь.
- разобрать JSON на iterable object
- выполните цикл и найдите определенные "имена" и измените их значение, например fstname, с John на другое имя.
- проанализируйте его обратно в 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"))}