歡迎來到Linux教程網
Linux教程網
Linux教程網
Linux教程網
Linux教程網 >> Linux編程 >> Linux編程 >> FastJson庫省略小數點後0的Bug的跟蹤

FastJson庫省略小數點後0的Bug的跟蹤

日期:2017/3/1 9:28:46   编辑:Linux編程

最近在項目中使用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

Copyright © Linux教程網 All Rights Reserved