天天看點

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

版權聲明:本文為部落客chszs的原創文章,未經部落客允許不得轉載。 https://blog.csdn.net/chszs/article/details/45854959

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

作者:chszs,轉載需注明。部落格首頁: http://blog.csdn.net/chszs

最近在項目中使用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後的打包版,下載下傳位址見:

http://download.csdn.net/detail/chszs/8718841