假设我有一个像这样的简单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
时才有效。
答案 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]
)。