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

Kee*_*san 7 java org.json

我刚刚编写了一个双精度值数组JsonObject.但是,当我打印它时,我的所有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);            
    }        
}
Run Code Online (Sandbox Code Playgroud)

输出:

{ "双打":[1,2,3]}

Ted*_*ddy 7

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

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

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

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

  • +1,我了解到Javascript中的所有数字都是浮点数,并且删除了零以节省一些字节,谢谢:) (2认同)
  • @JasonCapriotti在问题中,将Java double数组转换为JSON时,它看起来像JSON字符串中的整数数组。我解释说Javascript中的float / double / int之间没有区别。因此,“。0”是不必要的。因此,java中的JSON库无需添加“ .0”。希望您理解JSJSON是Javascript对象表示法。 (2认同)

sak*_*ura 6

它实际上没有转换成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]}


Pop*_*ibo 6

toStringnet.sf.json.JSONObject是最终调用下面的方法来翻译号码String(这里的源代码):

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;
    }
Run Code Online (Sandbox Code Playgroud)

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

System.out.println(numberToString(1.1) + " vs " + numberToString(1.0));
Run Code Online (Sandbox Code Playgroud)

给人,

1.1 vs 1
Run Code Online (Sandbox Code Playgroud)