<em>Mac</em>Book项目 2009年学校开始实施<em>Mac</em>Book项目,所有师生配备一本<em>Mac</em>Book,并同步更新了校园无线网络。学校每周进行电脑技术更新,每月发送技术支持资料,极大改变了教学及学习方式。因此2011
2021-06-01 09:32:01
在fastjson中有些getXXX方法 , 如getString , getInteger , getIntValue等 , 當呼叫getXXX方法時 , 如果傳入的key在json中不存在 , 那呼叫這些方法會報錯丟擲異常嗎 ?
首先來看程式碼demo
public static void main(String[] args) { String str = "{"name":"Bob","age":"18123"}"; JSONObject jsonObject = JSON.parseObject(str); String[] keys = { "age" , "score"}; for(String key : keys){ System.out.println(jsonObject.getString(key)); System.out.println(jsonObject.getInteger(key)); System.out.println(jsonObject.getIntValue(key)); } }
執行結果如下 :
18123
18123
18123
null
null
0
可看到 , 對不存在的key值(score)嘗試進行getXXX時 , 會返回當前型別的預設值(String返回null , Integer返回null , intValue返回0)
檢視getString/getInteger原始碼如下 :
public String getString(String key) { Object value = get(key); if (value == null) { return null; } return value.toString(); }
public Integer getInteger(String key) { Object value = get(key); return castToInt(value); }
getString
就是呼叫get方法 , 然後判斷為null , 為null則返回null , 否則呼叫物件的toString()方法.getInteger
就是相當於呼叫get方法 , 然後呼叫castToInt方法將Ojbect物件轉換為Integer物件 , castToInt方法如下 : public static Integer castToInt(Object value) { if (value == null) { return null; } if (value instanceof Integer) { return (Integer) value; } if (value instanceof Number) { return ((Number) value).intValue(); } if (value instanceof String) { String strVal = (String) value; if (strVal.length() == 0 // || "null".equals(strVal) // || "NULL".equals(strVal)) { return null; } if (strVal.indexOf(',') != 0) { strVal = strVal.replaceAll(",", ""); } return Integer.parseInt(strVal); } if (value instanceof Boolean) { return ((Boolean) value).booleanValue() ? 1 : 0; } throw new JSONException("can not cast to int, value : " + value); }
首先看到第一個if中進行了判斷 , 如果value值為null , 則直接返回null , 那getIntValue怎麼判斷的呢 , getIntValue原始碼如下 :
public 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做了判斷 , 如果沒有則會返回型別的預設值 .
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."); } }
和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; }
以上為個人經驗,希望能給大家一個參考,也希望大家多多支援it145.com。
相關文章
<em>Mac</em>Book项目 2009年学校开始实施<em>Mac</em>Book项目,所有师生配备一本<em>Mac</em>Book,并同步更新了校园无线网络。学校每周进行电脑技术更新,每月发送技术支持资料,极大改变了教学及学习方式。因此2011
2021-06-01 09:32:01
综合看Anker超能充系列的性价比很高,并且与不仅和iPhone12/苹果<em>Mac</em>Book很配,而且适合多设备充电需求的日常使用或差旅场景,不管是安卓还是Switch同样也能用得上它,希望这次分享能给准备购入充电器的小伙伴们有所
2021-06-01 09:31:42
除了L4WUDU与吴亦凡已经多次共事,成为了明面上的厂牌成员,吴亦凡还曾带领20XXCLUB全队参加2020年的一场音乐节,这也是20XXCLUB首次全员合照,王嗣尧Turbo、陈彦希Regi、<em>Mac</em> Ova Seas、林渝植等人全部出场。然而让
2021-06-01 09:31:34
目前应用IPFS的机构:1 谷歌<em>浏览器</em>支持IPFS分布式协议 2 万维网 (历史档案博物馆)数据库 3 火狐<em>浏览器</em>支持 IPFS分布式协议 4 EOS 等数字货币数据存储 5 美国国会图书馆,历史资料永久保存在 IPFS 6 加
2021-06-01 09:31:24
开拓者的车机是兼容苹果和<em>安卓</em>,虽然我不怎么用,但确实兼顾了我家人的很多需求:副驾的门板还配有解锁开关,有的时候老婆开车,下车的时候偶尔会忘记解锁,我在副驾驶可以自己开门:第二排设计很好,不仅配置了一个很大的
2021-06-01 09:30:48
不仅是<em>安卓</em>手机,苹果手机的降价力度也是前所未有了,iPhone12也“跳水价”了,发布价是6799元,如今已经跌至5308元,降价幅度超过1400元,最新定价确认了。iPhone12是苹果首款5G手机,同时也是全球首款5nm芯片的智能机,它
2021-06-01 09:30:45