【问题标题】:json.org zeros are saved as strings and not as numbersjson.org 零保存为字符串而不是数字
【发布时间】:2011-06-23 10:19:10
【问题描述】:

我正在使用org.json 将大 xml 转换为 json 字符串。但是,对于数字 0,它似乎会创建一个字符串“0”,而其他数字(如 5 或 2)可以正常工作并成为实数。

xml:

<w count="2" winline="5" freespins="0" jackpot="false" start="0" payout="500" supergames="0" />

java:

JSONObject json = XML.toJSONObject(xml);
String jsontext = json.toString();

生成的 json:

"w":[{"supergames":"0","freespins":"0","winline":5,"count":2,"start":"0","jackpot":false,"payout":500}

有没有办法让0变成真正的0-数字而不是字符串?

【问题讨论】:

标签: java xml json org.json


【解决方案1】:

这里是将 XML 属性转换为 JSON 值的snippet of code

我可能错了,但是值为“0”的情况不处理。

try {
            char initial = string.charAt(0);
            boolean negative = false;
            if (initial == '-') {
                initial = string.charAt(1);
                negative = true;
            }
            if (initial == '0' && string.charAt(negative ? 2 : 1) == '0') {
                return string;
            }
            if ((initial >= '0' && initial <= '9')) {
                if (string.indexOf('.') >= 0) {
                    return Double.valueOf(string);
                } else if (string.indexOf('e') < 0 && string.indexOf('E') < 0) {
                    Long myLong = new Long(string);
                    if (myLong.longValue() == myLong.intValue()) {
                        return new Integer(myLong.intValue());
                    } else {
                        return myLong;
                    }
                }
            }
        }  catch (Exception ignore) {
        }

【讨论】:

  • 开枪 - 你打败了我,因为我走了一分钟 :-)
  • @Bert_F,但您的评论指出了实际问题!考虑到道格拉斯·克罗克福德是这段代码的作者,空的 catch 块是相当可怕的......
  • >>考虑到道格拉斯·克罗克福德,他还在代码的其他部分使用getClass().getClassLoader(),这些部分不会在applet 或webstart 应用程序上运行。
【解决方案2】:

看起来像一个错误。我看了下源码,好像可能会抛出IndexOutOfBoundsException,这基本上导致转换为数字失败:

https://github.com/douglascrockford/JSON-java/blob/master/XML.java(第 327 行):

if (initial == '0' && string.charAt(negative ? 2 : 1) == '0') {

如果字符串以“0”开头并且只有 1 个字符长,即如果字符串为“0”,则抛出此错误。异常被捕获,转换方法基本上只是返回原始字符串(“0”)再次未转换。

选项不多:

  1. 报告错误并希望尽快修复。
  2. 现在在您自己的文件副本中自行修复。
  3. 如果您的情况可以接受0.0 代替0,则将XML 中的“0”改为“0.0”。 (信用@bestsss)

【讨论】:

  • @bestsss:是的,我可以,但实际上我不想。我宁愿修复错误。
  • @clamp,我不建议你这样做(使用 0.0)并且修复是正确的方法(我会在我自己的库中修复它并继续前进);如果您需要处理生产中的问题,这只是一个解决方案。
  • @bestss 同意,对于一些未来的读者来说,这可能是一个可行的选择,即使在这种情况下它不是 @clamp 的选择。但希望它在不久的将来是一个非问题期。
猜你喜欢
  • 2015-12-13
  • 1970-01-01
  • 2019-07-12
  • 1970-01-01
  • 2020-11-30
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多