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

时间:2016-02-19 22:45:43

标签: json scala json4s

假设我有一个像这样的简单JSON数组:

apply plugin: 'android'

android {
    compileSdkVersion 19
    buildToolsVersion '21.1.2'
    defaultConfig {
        minSdkVersion 15
        targetSdkVersion 19
        versionCode 1
        versionName "2.0"
        testInstrumentationRunner "android.test.InstrumentationTestRunner"
    }

    buildTypes {
        release {
            minifyEnabled true
            debuggable false
            proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.txt'
        }
        debug {
            debuggable true
            minifyEnabled false
            multiDexEnabled false
            testCoverageEnabled = true
        }
    }
}

dependencies {
    compile fileTree(include: ['*.jar'], dir: 'libs')
}

请注意,第二个对象没有[ { "name": "Alex", "age": 12 }, { "name": "Peter" } ] 字段。

我使用JSON4S查询JSON(使用age样式提取值):

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

This answer给出了如何使用自定义提取器处理JSON中的None值的示例,但仅当字段存在且值为null时才有效。

1 个答案:

答案 0 :(得分:2)

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