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。

这就可以解释今天发现的小秘密啦~ 得意

  • 4
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值