今天用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表示更好一些。