Запретить JSON4S пропускать объекты JSON с отсутствующим полем

Предположим, у меня есть простой массив JSON вроде этого:

[ 
  { 
    "name": "Alex",
    "age": 12
  },
  { 
    "name": "Peter"
  }
]

Обратите внимание, что у второго объекта нет поля age.

Я использую JSON4S для запроса JSON (используя стиль for-comprehension для извлечения значений):

 for {
      JArray(persons) <- json
      JObject(person) <- persons
      JField("name", JString(name)) <- person
      JField("age", JString(age)) <- person
 } yield new Person(name, age) 

Проблема для меня в том, что это выражение пропустит второй объект (тот, у которого отсутствует поле age). Я не хочу пропускать такие объекты; Мне нужно получить null или лучше None.


В этом ответе приведен пример того, как работать со значениями null в JSON с помощью настраиваемых экстракторов, но он работает, только если поле присутствует и если его значение null.


person MyTitle    schedule 19.02.2016    source источник


Ответы (1)


Деконструкция объектов в json4s может вызвать некоторые неудобства, поскольку вы больше не можете использовать причудливые запросы \ и \\.

Я предпочитаю делать что-то подобное:

for {
    JArray(persons) <- json
    person@JObject(_) <- persons
    JString(name) <- person \ "name"
    age = (person \ "age").extractOpt[Int]
     } yield (name, age)

res7: List[(String, Option[Int])] = List(("Alex", Some(12)), ("Peter", None))

В этом примере также показаны две альтернативы извлечения полей объекта (вместо этого вы также можете использовать name = (person \ "name").extract[String]).

person Aivean    schedule 20.02.2016