Преобразование из XML в JSON с использованием орг. json: как сохранить числовой формат? - PullRequest
0 голосов
/ 09 марта 2020

Я конвертирую простой XML в JSON, используя org.json lib:

import org.json.JSONObject;
import org.json.XML;

public class TestJson {
    public static void test_number() {
        String xml = "<BALANCE>32032033.10</BALANCE>";
        JSONObject jsonObj = XML.toJSONObject(xml);
        String json_str = jsonObj.toString(4);
        System.out.println(String.format("%s\n----\n%s", xml, json_str));
    }

    public static void main(String[] args) {
        try {
            test_number();
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
}

Мои результаты:

<BALANCE>32032033.10</BALANCE>
----
{"BALANCE": 3.20320331E7}

Как видите, формат числа изменился с нормально, до науки c. Как я могу сохранить числовой формат? Я хотел бы видеть JSON как:

{"BALANCE": 32032033.10}

или предпочтительно как строку:

{"BALANCE": "32032033.10"}

Я использую org.json из json-20190722.jar

Ответы [ 3 ]

2 голосов
/ 09 марта 2020

Надеюсь, что приведенный ниже код поможет решить проблему. Пожалуйста, используйте XML.toJSONObject(xml,true) вместо XML .toJSONObject (xml);

import org.json.JSONObject;
import org.json.XML;

public class TestJson {
    public static void test_number() {
        String xml = "<BALANCE>32032033.10</BALANCE>";
        JSONObject jsonObj = XML.toJSONObject(xml,true);
        System.out.println(String.format("%s\n----\n%s", xml, jsonObj.toString()));
    }

    public static void main(String[] args) {
        try {
            test_number();
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
}

Вывод:

<BALANCE>32032033.10</BALANCE>
----
{"BALANCE":"32032033.10"}
1 голос
/ 09 марта 2020

Здесь вы можете использовать либо

 <!-- https://mvnrepository.com/artifact/org.json/json -->
 <dependency>
      <groupId>org.json</groupId>
      <artifactId>json</artifactId>
      <version>20140107</version>
 </dependency>

Тогда ваш существующий код будет работать без каких-либо изменений.

В противном случае вы захотите go с последней версией, т.е. json-20190722.jar, затем вам нужно передать true в качестве дополнительного параметра в вашем методе toJSONObject(String string, boolean keepStrings), как предложено @vigneshwaran m.

where @param keepStrings If true, then values will not be coerced into boolean
     *  or numeric values and will instead be left as strings

Это из json -20190722.jar javado c, проверьте здесь https://github.com/stleary/JSON-java/blob/master/XML.java

0 голосов
/ 09 марта 2020

У вас есть String, полученное при разборе JSON с использованием этой строки:

String json_str = jsonObj.toString(4);

Вы можете сохранить или сбросить формат, создав BigDecimal из этого String и применяя форматирование чисел с использованием setScale(...) следующим образом:

public static void main(String[] args) {
    String json_str = "3.20320331E7";
    BigDecimal bigDecimal = new BigDecimal(json_str);
    System.out.println(bigDecimal.setScale(2, BigDecimal.ROUND_HALF_UP));
}

Вывод этого примера main будет таким:

32032033.10
...