歡迎來到Linux教程網
Linux教程網
Linux教程網
Linux教程網
您现在的位置: Linux教程網 >> UnixLinux >  >> Linux編程 >> Linux編程

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

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