通常在对 json 格式的字符串进行解析时,会遇到取具体字段值的处理,以获取 String 字段为例,在方法调用上有以下两种,
- getString
要求较高,如果没有取到对应字段,就会抛 JSONException,不建议用 - optString
当没有取到字段时,会返回"",也可以指定返回某个值。当有对应值时,取到的就是对应值。
同理,在解析任何类型是,应该都会有 opt 的获取方式,以 optString 和 optJSONArray 为例,在具体使用上需要考虑以下几种异常情况。
不存在字段
在用 optString 时会获取到默认值 ""。存在字段,但格式不正确
//例如这种,在运行解析时会抛异常
//建议做好异常捕获和日志跟踪
{
"name":
}
- 存在字段,但赋值为 null
{
//像这样为 null 的情况处理时就返回默认值 "",当然默认值可以指定
"name":null,
//像这样就会直接读取为 "null" 值字符串
"name2":"null",
//像这样就会返回数组为 null
"array":null
}
- 存在字段,但赋值为空
{
//像这样就会直接读取为 "" 值字符串
"name":"",
//像这样就会返回一个空数组
"array":[]
}
- 存在字段,但赋值不正确
{
//如果以 optString 获取,最终会成为 "123" 字符串
"name":123,
//如果以 optJSONArray 获取,最终会返回 null
"array":""
}
- 存在字段,但数组中个别元素为 null,"null"
//像这样,解析这个数组,因为会以对象的形式去解析每个元素
//index == 1 时返回的就是 null
//index == 3,4 时返回的也都是 null
{
"array":[{
"itemName":"1"
},null,{
"itemName":"2",
"itemVal":"value"
},"null","name"]
}
我们在手动解析 json 的时候,永远都不要太相信数据源,要做好容错,否者数据的源头出问题,后续的处理都将会是有问题的。