項目中使用 fastjson 來處理 json 格式,當前使用的版本爲1.1.37。在和其它系統交互時,將一個json串傳給了對方,原值爲5.0,json 處理後格式爲:{"dou", 5}; 結果對方處理該串報錯了, 緣由是他將串整理轉成 Map ,在取值時強制轉爲了 Double ,由於拿到的值轉化是 Integer 類型,強轉確定異常了。 簡單的作法應該經過 Double.valueOf(value) 進行處理。但無奈合做方不肯意處理。 因而測試了下fastjson處理這個串時,經過如下作處理, 輸出的結果爲 {"dou", 5}。git
JSONObject jsonObject = new JSONObject(); Double dou = new Double(5.0); jsonObject.put("dou", dou); System.out.println(JSON.toJSONString(jsonObject));
想要輸出{"dou",5.0} 怎麼辦, 跟蹤了下源碼,發如今 DoubleSerializer 的 write 方法中,判斷告終尾若是是.0 就截掉了。github
doubleText = Double.toString(doubleValue); if(doubleText.endsWith(".0")) { doubleText = doubleText.substring(0, doubleText.length() - 2); }
那想要的格式怎麼辦,能夠經過自定義 filter 方式實現,:json
ValueFilter filter = new ValueFilter() { @Override public Object process(Object object, String name, Object value) { if(value instanceof BigDecimal || value instanceof Double || value instanceof Float){ return new BigDecimal(value.toString()); } return value; } }; String s = JSON.toJSONString(jsonObject, filter, new SerializerFeature[0]);
以上能夠完美解決。後來想有沒有跟好的方法呢。 因而網上搜索了一下,大多數都是這種作法,而且有人認爲這是一個bug,因而忽然想有沒有可能 wenshao 會處理一下,因而在 github 找到 fastjson 的最新版本 1.2.23。 先修改 pom 文件,而後運行。發現即便不處理也能輸出了 {"dou",5.0} 。 因而 debug 進去原來對 DoubleSerializer 進行了重寫,並在 write 方法中原來處理格式的地方修改成以下:ide
if (decimalFormat == null) { out.writeDouble(doubleValue, true); } else { String doubleText = decimalFormat.format(doubleValue); out.write(doubleText); } //out SerializeWriter String doubleText = Double.toString(doubleValue); if (isEnabled(SerializerFeature.WriteNullNumberAsZero) && doubleText.endsWith(".0")) { doubleText = doubleText.substring(0, doubleText.length() - 2); }
即,以上粉色代碼調用 SerializeWriter 的writeDouble 方法, 看綠色部分。 同時判斷了 SerializerFeature.WriteNullNumberAsZero 和 結尾是否爲 .0測試
就是經過這個解決了 double 精度的正常輸出。 在使用 1.2.23時若是想輸出{"dou", 5}, 能夠經過設置 SerializerFeature.WriteNullNumberAsZero 實現。spa
System.out.println(JSON.toJSONString(jsonObject, SerializerFeature.WriteNullNumberAsZero));
囉嗦了這麼,但願經過升級版本解決一樣遇到這樣問題的小夥伴。debug