今天发现了net.sf.json.JSONObject.fromObject()方法的一个小秘密哦!
看这段代码:
public static void main(String[] args) {
List<Map<String, Object>> list=new ArrayList<Map<String, Object>>();
HashMap<String, Object> map1=new HashMap<String, Object>();
map1.put("key", "1");
map1.put("value", "a");
list.add(map1);
HashMap<String, Object> map2=new HashMap<String, Object>();
map2.put("key", "2");
map2.put("value", null);
list.add(map2);
HashMap<String, Object> map3=new HashMap<String, Object>();
map3.put("key", "3");
list.add(map3);
for(int i=0;i<list.size();i++){
net.sf.json.JSONObject mapJson=net.sf.json.JSONObject.fromObject(list.get(i));
Object key=mapJson.get("key");
Object value=mapJson.get("value");
if(key==null){
System.out.println("this element's key is null!");
}else{
System.out.println("key:"+key.getClass().getName()+"--"+key.toString());
}
if(value==null){
System.out.println("this element's value is null!");
}else{
System.out.println("value:"+value.getClass().getName()+"--"+value.toString());
}
System.out.println("---------------------------------------");
}
}
上面这段程序的思路大概是这样的:
定义了 map1 , map2 , map3 这三个HashMap :
map1 中 键 key 和 value 都有对应的非 null 的取值;map2 中 键 key 的取值不为 null ,而 键 value 对应的取值为 null ;
最后, map3 的 键 key 同样不等于 null ,且没有定义 键 value 。
对这三个map分别使用 net.sf.json.JSONObject.fromObject() 方法,获得 JSONObject 对象,用 JSONObject 类的 get() 方法,读取转换出的 JSONObject中的 key 和 value 的值,对读取到的 key 和 value 是否为 null 进行判断,并根据判断结果输出不同信息。
这段程序应该输出什么呢?
map1 的 输出是没有疑义的,至于 map2 和 map3 的 value 根据茉茉一贯的理解,value==null 的判断结果应该为真,然后输出 this element's value is null! 。
但是结果确不是这样的。
事实上,控制台输出了这个玩意儿:
map1 和 map3 的输出结果是在意料中的,但是,那个 map2 的 net.sf.json.JSONNull 是个嘛啊。
经过几番尝试发现:
net.sf.json.JSONObject.fromObject() 方法,当参数为 Map 对象时,如存在这样的“键值对”:键被定义,但对应的值为 null , null 会转为 JSONNull
暂时没有找到json-lib的源代码,并不清楚造成这样的原因是什么,不过这个发现蛮有意思的不是么。
补充:找到源码了,撒花~:
JSONObjec t类 中的 public static JSONObject fromObject( Object object, JsonConfig jsonConfig ) 方法,有这样一段:
else if( object instanceof Map ){
return _fromMap( (Map) object, jsonConfig );
}
查看 _fromMap() 方法,对于 map 的键值对中的值,有这样一段处理:
<span style="white-space:pre"> </span>if( value != null ){
JsonValueProcessor jsonValueProcessor = jsonConfig.findJsonValueProcessor(
value.getClass(), key );
if( jsonValueProcessor != null ){
value = jsonValueProcessor.processObjectValue( key, value, jsonConfig );
bypass = true;
if( !JsonVerifier.isValidJsonValue( value ) ){
throw new JSONException( "Value is not a valid JSON value. " + value );
}
}
setValue( jsonObject, key, value, value.getClass(), jsonConfig, bypass );
}else{
if( jsonObject.properties.containsKey( key ) ){
jsonObject.accumulate( key, JSONNull.getInstance() );
firePropertySetEvent( key, JSONNull.getInstance(), true, jsonConfig );
}else{
jsonObject.element( key, JSONNull.getInstance() );
firePropertySetEvent( key, JSONNull.getInstance(), false, jsonConfig );
}
}
当值(value)为 null 时,将 JSONNull.getInstance() 的结果赋给该 key。
这就可以解释今天发现的小秘密啦~