使用Gson中的JsonElement所遇到的坑


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,很明顯這里是沒有雙引號的。
getAsString
加上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");
        }

getAsInt

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


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM