防止 JSON4S 跳过缺少字段的 JSON 个对象

Prevent JSON4S from skipping JSON objects with a missing field

假设我有一个像这样的简单 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


This answer 给出了如何使用自定义提取器处理 JSON 中的 null 值的示例,但它仅在字段存在且其值为 null

解构 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])。