为什么double在JSON字符串中转换为int

时间:2014-02-23 08:15:48

标签: java org.json

我刚编码在JsonObject中放置一个double值数组。但是,当我打印它时,我的所有double值都会转换为int值。谁能帮我理解背后发生的事情?请让我知道在JsonObject

中放置原始数组的最佳方法
public class JsonPrimitiveArrays {        
    public static void main(String[] args) {
        JSONObject jsonObject = new JSONObject();
        double[] d = new double[]{1.0,2.0,3.0};
        jsonObject.put("doubles",d);
        System.out.println(jsonObject);            
    }        
}

输出:

  

{ “双打”:[1,2,3]}

3 个答案:

答案 0 :(得分:7)

所有数字都是Javascript中的浮点数。所以,JS和1.0中的1.0和1相同。没有int,float和double的区别。

由于JSON最终将作为JS对象,因此添加额外的'.0'是没有用的,因为'1'也代表浮点数。我想这样做是为了在传递的字符串中保存几个字节。

所以,你将在JS中获得一个浮点数,如果你将它解析回Java,你应该得到一个双精度数。试试吧。

与此同时,如果您对屏幕上显示的方式感兴趣,可以尝试一些字符串格式,使其看起来像“1.0”。

答案 1 :(得分:6)

查看toString of net.sf.json.JSONObject,它最终会调用以下方法将数字转换为Stringsource code here):

public static String numberToString(Number n) {
        if (n == null) {
            throw new JSONException("Null pointer");
        }
        //testValidity(n);

        // Shave off trailing zeros and decimal point, if possible.

        String s = n.toString();
        if (s.indexOf('.') > 0 && s.indexOf('e') < 0 && s.indexOf('E') < 0) {
            while (s.endsWith("0")) {
                s = s.substring(0, s.length() - 1);
            }
            if (s.endsWith(".")) {
                s = s.substring(0, s.length() - 1);
            }
        }
        return s;
    }

它显然试图在可能的情况下摆脱尾随的零,(s = s.substring(0, s.length() - 1)如果一个字符串以零结尾)。

System.out.println(numberToString(1.1) + " vs " + numberToString(1.0));

给出,

1.1 vs 1

答案 2 :(得分:5)

它实际上没有转换成int。唯一发生的事情就是JS对象没有显示.0这是不相关的。

在示例程序中,将部分值从double[] d = new double[]{1.0,2.0,3.0}更改为

double[] d = new double[]{1.0,2.1,3.1}并运行程序。

你将观察它的实际不转换为int。您将获得的输出是{"doubles":[1,2.1,3.1]}