json在不知道key的情况下,json没有key
目录
1 .fastjson2 .net.sf.json3 .org.json
1 . fastjson
在使用中有些getXXX方法, 如getString,getInteger,getIntValue等,当调用getXXX方法时, 如果传入的键在数据中不存在, 那调用这些方法会报错抛出异常吗?
首先来看代码演示
public static void main(String[]args){ String str= { name : Bob , age : 18123 } JSON object JSON object=JSON。解析对象(字符串);String[] keys={ age , score };for(String key : keys){ system。出去。println(JSON对象。getstring(key));系统。出去。println(JSON对象。getinteger(key));系统。出去。println(JSON对象。getint value(key));}}运行结果如下:
181231812318123nullnull0
可看到, 对不存在的键值(分数)尝试进行getXXX时, 会返回当前类型的默认值(字符串返回空,整数返回null,intValue返回0)
查看getString/getInteger源码如下:
公共字符串getString(String key){ Object value=get(key);if(value==null){ return null;}返回值.tostring();} public Integer getInteger(String key){ Object value=get(key);返回卡斯托因(值);}getString就是调用得到方法, 然后判断为空,为空则返回空,否则调用对象的toString()方法.getInteger就是相当于调用得到方法, 然后调用卡斯托因特方法将对象对象转换为整数对象卡斯托因方法如下:公共静态整数卡斯托因(对象值){ if(value==null){ return null;} if(Integer的值实例){ return(Integer)值;} if(Number的值实例){ return((Number)value).int value();} if(字符串的值实例){ String strVal=(字符串)值;if(strval。length()==0/ null .equals(strVal) // NULL .等于(strVal)) {返回null} if (strVal.indexOf(,)!=0) { strVal=strVal.replaceAll(,, );}返回整数。parse int(strVal);} if(Boolean值实例){ return((Boolean)值).booleanValue()?1 : 0;}抛出新的JSONException(“不能强制转换为int,value : value);}首先看到第一个如果中进行了判断, 如果价值值为空,则直接返回空,那getIntValue怎么判断的呢,getIntValue源码如下:
普布利
c int getIntValue(String key) { Object value = get(key); if (value == null) { return 0; } return castToInt(value).intValue();}原来在调用castToInt之前 ,就先做了一次null的判断 , 为null直接返回了0 .
那调用get方法获取一个不存在的key时 , 为什么会返回null而不是报错呢 , 查看get源码如下
public Object get(Object key) { return map.get(key);}
map是JSONObject的一个成员变量
private final Map<String, Object> map;
原来 , JSONObject先将json字符串转换为了一个map , 而map的get方法获取不存在的key时 , 返回的就是null .
由此可以看到 , fastjson对不存在的key做了判断 , 如果没有则会返回类型的默认值 .
2 . net.sf.json
public static void main(String[] args) { String str = "{"name":"Bob","age":"18"}"; JSONObject jsonObject = JSONObject.fromObject(str);// System.out.println(jsonObject.get("gender"));//null// System.out.println(jsonObject.getString("gender"));//JSONObject["gender"] not found// System.out.println(jsonObject.getInt("age"));//18 System.out.println(jsonObject.getInt("score"));//JSONObject["score"] is not a number }
可以看到和fastjson的处理策略不同 , 它是对不存在的key抛出一个JSONException异常 , 查看源码可以看到
public String getString(String key) { this.verifyIsNull(); Object o = this.get(key); if (o != null) { return o.toString(); } else { throw new JSONException("JSONObject[" + JSONUtils.quote(key) + "] not found."); } }
public int getInt(String key) { this.verifyIsNull(); Object o = this.get(key); if (o != null) { return o instanceof Number ? ((Number)o).intValue() : (int)this.getDouble(key); } else { throw new JSONException("JSONObject[" + JSONUtils.quote(key) + "] is not a number."); } }
3 . org.json
和net.sf.json一样 , org.json对不存在的key策略还是抛出异常 . 但org.json更加严格 , 在使用get("key")时就会直接抛出异常
public static void main(String[] args) throws Exception { String str = "{"name":"Bob","age":"18"}"; JSONObject jsonObject = new JSONObject(str); System.out.println(jsonObject.get("gender"));//No value for gender System.out.println(jsonObject.getString("gender"));//No value for gender System.out.println(jsonObject.getInt("age"));//18 System.out.println(jsonObject.getInt("score"));//No value for score }
get方法源码如下 :
public Object get(String name) throws JSONException { Object result = nameValuePairs.get(name); if (result == null) { throw new JSONException("No value for " + name); } return result; }
getString源码如下 , getInt与之类似 :
public int getInt(String name) throws JSONException { Object object = get(name); Integer result = JSON.toInteger(object); if (result == null) { throw JSON.typeMismatch(name, object, "int"); } return result; }
以上为个人经验,希望能给大家一个参考,也希望大家多多支持盛行IT。
郑重声明:本文由网友发布,不代表盛行IT的观点,版权归原作者所有,仅为传播更多信息之目的,如有侵权请联系,我们将第一时间修改或删除,多谢。