javascript
net.sf.json.JSONObject.fromObject()方法的一个小秘密
今天發現了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。這就可以解釋今天發現的小秘密啦~
總結
以上是生活随笔為你收集整理的net.sf.json.JSONObject.fromObject()方法的一个小秘密的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: JQuery常用的代码片段
- 下一篇: 解决用户控件循环引用的笨办法