Google的gson.jar包在開發中經常使用,有一些細節的地方稍不注意就會踩到坑。這里介紹一下使用JsonElement取值所遇到的問題,避免以后再犯這種錯誤。
我們先看一個例子:
public static void main(String[] args) {
JsonObject js = new JsonObject();
js.addProperty("name", "phone");
js.addProperty("price", 999);
js.addProperty("type", "mi");
System.out.println("js-->" + js);
String jsStr = js.toString();
System.out.println("str-->" + jsStr);
System.out.println("------------------");
if("mi".equals(js.get("type"))){
System.out.println("這是小米手機");
}else{
System.out.println("這不是小米手機");
}
if("mi".equals(js.get("type").toString())){
System.out.println("這是小米手機");
}else{
System.out.println("這不是小米手機");
}
}
輸出信息如下:
js-->{"name":"phone","price":999,"type":"mi"}
str-->{"name":"phone","price":999,"type":"mi"}
------------------
這不是小米手機
這不是小米手機
在JsonObject js里面,”type”對應的值應該是String類型的”mi”,那么輸出信息應該是”這是小米手機”。
為什么這里輸出結果不是我們預想那樣呢?是不是很奇怪,感興趣的同學可以先自己想想再接着往下看。
我們先把if()里面的判斷條件打印出來,會看到:
JsonElement-->"mi"
JsonElement2Str-->"mi"
細心的同學其實可以發現js.get(“type”)和type.toString()返回的都是”“mi”“(注意多了一對雙引號),我當時也是通過打斷點一步步調試才發現這個問題。
難道我們把if里面判斷條件也改成”“mi”“,這樣雖然滿足了判斷條件,但總是有點怪怪的感覺。
查閱gson的api文檔,會發現JsonElement還有一個getAsString()方法,於是試了一下 js.get(“type”).getAsString(),輸出字符串mi,很明顯這里是沒有雙引號的。
加上isJsonNull()防止出現null,使程序更健壯。
對於int、boolean、long等類型,取值方法也是類似的。如下圖:
int prc = ((JsonElement)js.get("price")).isJsonNull()? -1 : js.get("price").getAsInt();
System.out.println(prc);
if(prc == 999){
System.out.println("價格只要999");
}else{
System.out.println("價格不是999");
}

例子看起來很簡單,但是實際開發中如果忽視了這些問題,會花費很長時間來debug,所以還是應該細心一點。
