alibaba的fastjson,版本:2.0.3
重要说明点:JSON中,没有传 duration 这个参数
编译前的代码:
double d = headers.getDouble("duration");
JSONObject的原码:
public Double getDouble(String key) {
Object value = this.map.get(key);
if (value == null) {
return null;
} else if (value instanceof Double) {
return (Double)value;
} else if (value instanceof Number) {
return ((Number)value).doubleValue();
} else if (value instanceof String) {
String str = (String)value;
return !str.isEmpty() && !"null".equalsIgnoreCase(str) ? Double.parseDouble(str) : null;
} else {
throw new JSONException("Can not cast '" + value.getClass() + "' to Double");
}
}
编译后的代码:
double d = headers.getDouble("duration").doubleValue();
通过分析源码及自己的代码可以发现:从JSON中获取的类型是基本数据类型,且接收的变量也是基本数据类型时,会有数据类型转换,如:.intValue()、.longValue()、.shortValue()等;而如果接收的变量类型为封闭的基本数据类型,为强制类型转换,如:(Integer) value、(Long) value、(Short) value等;
结论:
在接收的变量类型是基本数据类型时,JSON中没有传某个变量或变量值为空时,get时会报空指针异常;如果接收的变量类型是封装的基本数据类型,JSON中没有传某个变量或变量值为空时,get到的会是 null。