google的Gson和alibaba的fastjson簡單對比


今天用Gson去對接Json,然后就出現了一個問題。對方給出的文檔說該值是Number類型,然后又是金額相關的,我就直接用了BigDecimal接受,然后json轉實體類的時候就出問題了。

java.lang.NumberFormatException

我感覺自己沒寫錯啊,又試了幾次,發現還是轉換異常,那想了想應該文檔有點問題,可能有數據不是Number類型,開始排查。

最后發現是一個key不能是BigDecimal類型,把返回的json數據格式化,然后搜索key。對比value,大部分都是數字的(沒有用到三位分節法之類的),目前沒有發現什么問題。

然后實體類把BigDecimal改成String,輸出下實體類的toString,快捷鍵搜索,就發現了有些數據是這種結果:

// xx是Number類型
xx=,aa="aaa"
xx="0.00",aa="bbb"

xx就直接是=,后面什么也沒有,找到問題點了。根據關鍵字,找到對應的Json數據行,發現所有拿到的json數據全部是String類型,被""給引起來的,不管是Number類型還是String類型

就出現了一個情況:返回的Number類型中有"",也有"0.00","0.00"能被轉換,但是""就轉換失敗了,不能被轉成BigDecimal。

后來和對方說了下這個問題,直接用String,但是我感覺不對勁,雖然Json用""引起來的String來存Number我個人感覺不是個好習慣,但是你也不能說""就轉不了BigDecimal了吧?

鑒於被Gson坑了幾次了,說實話,真的感覺Gson有點廢,總出現幾個出乎意料的結果。

 

然后試試了fastjson,對比了他們對同一個數據的處理結果:

<dependency>
            <groupId>com.google.code.gson</groupId>
            <artifactId>gson</artifactId>
            <version>2.8.5</version>
        </dependency>


        <dependency>
            <groupId>com.alibaba</groupId>
            <artifactId>fastjson</artifactId>
            <version>1.2.72</version>
        </dependency>

 

public static void main(String[] args) {
        String jsonStr = "{\"aa\":\"\"}";
        JSONObject jsonObject = JSON.parseObject(jsonStr);
        System.out.println(jsonObject.get("aa"));
        System.out.println(jsonObject.getString("aa"));
        System.out.println(jsonObject.getBigDecimal("aa"));

        System.out.println("--------------------------");

        Gson gson = new Gson();
        JsonObject jsonObject1 = gson.fromJson(jsonStr, JsonObject.class);
        System.out.println(jsonObject1.get("aa"));
        System.out.println(jsonObject1.get("aa").getAsString());
        System.out.println(jsonObject1.get("aa").getAsBigDecimal());
    }

下方是輸出結果:

 

 fastjson是空白,空白,null

gson是"",空白,轉換異常。

 

哎,感覺gson比較不太行啊。雖然每個api的設計都有自己的考量,但是感覺這里不應該說轉換異常的,用null表示更好一些。


免責聲明!

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



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