Нули json.org сохраняются как строки, а не как числа - PullRequest
1 голос
/ 08 февраля 2011

Я использую 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-числами вместо строк?

Ответы [ 2 ]

3 голосов
/ 08 февраля 2011

Похоже, ошибка.Я посмотрел на источник, и похоже, что он может выдать 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, тогда нажмите "0" 'в XML будет "0.0".(кредит @bestsss)
3 голосов
/ 08 февраля 2011

Вот фрагмент кода , который преобразует атрибут XML в значение JSON.

Я могу ошибаться, но случай, когда значение равно "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) {
        }
...