最近在項目中使用FastJson庫,因為FastJson是阿裡巴巴開源的JSON工具包,處理JSON的速度很快,性能也很好,而且功能強大,完全支持Java Bean、集合、Map、日期、Enum、范型等。
但是我們在使用中,發現一個Bug:
我們的接口中定義了某個float類型的參數,但是如果傳過來的值的小數點後面為0的話(比如12.0),那麼“.0”會被省略掉。而這一點是我們不能接受的。
下面對此Bug詳細說明,比如代碼如下:
com.alibaba.fastjson.JSONObject json = new com.alibaba.fastjson.JSONObject();
json.put("phone", "13911112222");
json.put("authCode","285345");
json.put("deviceType", "phone");
json.put("myvalue", 12.0);
String json1 = json.toString();
System.out.println("JSON-->"+json1);
如上代碼,myvalue參數的值是12.0,但是此代碼輸出的結果是:
JSON-->{"authCode":"285345","deviceType":"phone","myvalue":12,"phone":"13911112222"}
可見,“.0”被省略掉了。
跟蹤FastJson庫的源碼,發現JSONObject類繼承自JSON類,而且toString()方法直接繼承父類的方法,未做覆蓋,繼續查看JSON類的toString()方法,發現是這樣的:
@Override
public String toString() {
return toJSONString();
}
直接調用了toJSONString()方法。而toJSONString()方法又是這樣的:
public String toJSONString() {
SerializeWriter out = new SerializeWriter();
try {
new JSONSerializer(out).write(this);
return out.toString();
} finally {
out.close();
}
}
繼續追查,查看SerializeWriter類的源碼,找到writeFloatAndChar()方法,代碼如下:
public void writeFloatAndChar(float value, char c) {
String text = Float.toString(value);
if (text.endsWith(".0")) {
text = text.substring(0, text.length() - 2);
}
write(text);
write(c);
}
終於定位到原因了,對於JSON值的浮點數,如果是以“.0”結尾的,直接截斷這個結尾,所以就有了本文開頭的一幕。
結論:雖然這個不完全算是Bug,但是這種省略浮點數的“.0”結尾,有時候不能滿足業務需求。
這裡我提供一個基於fastjson v1.1.38版源碼修改此Bug後的打包版,下載地址見:fastjson.rar
------------------------------------------分割線------------------------------------------
免費下載地址在 http://linux.linuxidc.com/
用戶名與密碼都是www.linuxidc.com
具體下載目錄在 /2015年資料/6月/8日/FastJson庫省略小數點後0的Bug的跟蹤/
下載方法見 http://www.linuxidc.com/Linux/2013-07/87684.htm
------------------------------------------分割線------------------------------------------
Json應用案例之FastJson http://www.linuxidc.com/Linux/2015-03/115366.htm