【问题标题】:Converting from XML to JSON using org.json: how to preserve number format?使用 org.json 从 XML 转换为 JSON:如何保留数字格式?
【发布时间】:2020-03-09 08:06:40
【问题描述】:

我正在使用 org.json lib 将简单的 XML 转换为 JSON:

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}

如您所见,数字的格式从正常变为科学。如何保留数字格式?我希望将 JSON 视为:

{"BALANCE": 32032033.10}

或者最好是字符串:

{"BALANCE": "32032033.10"}

我使用来自json-20190722.jarorg.json

【问题讨论】:

  • 3.20320331E7 和 32032033.1 如果被视为数字,则完全相同。您的代码或任何客户端代码都不应该关心。
  • 当然它们与数字相同,但不适用于 grep 或其他文本实用程序。
  • 那么是的,字符串是要走的路。数字应该这样对待。
  • @Michał Niklas,您使用的是哪个版本的 org.json 库?
  • @Michał Niklas,如果您可以将 org.json 库版本升级到高于 20090211 的版本,您现有的代码将可以工作(看来您使用的是旧版本,即可能是2009 发布版如上图)发布。

标签: java json xml org.json


【解决方案1】:

希望以下代码有助于解决问题。请使用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"}

【讨论】:

    【解决方案2】:

    这里你可以使用任何一个

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

    那么您现有的代码将无需任何更改即可工作。

    否则您想使用最新版本,即json-20190722.jar,那么您需要按照@vigneshwaran m 的建议在toJSONObject(String string, boolean keepStrings) 方法中将true 作为额外参数传递。

    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 javadoc,查看这里https://github.com/stleary/JSON-java/blob/master/XML.java

    【讨论】:

      【解决方案3】:

      您有一个String,您可以使用以下行解析 JSON:

      String json_str = jsonObj.toString(4);
      

      您可以通过从该String 创建一个BigDecimal 并使用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
      

      【讨论】:

      • 我更喜欢从 XML 进行纯文本转换:将每个数据都视为简单的字符串。
      • @MichałNiklas 好的,你可以这样做...在String 中找到E 的索引,获取E 后面的数字并相应地移动逗号/点...可能会奏效。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2020-08-30
      • 2011-11-03
      • 1970-01-01
      • 1970-01-01
      • 2016-10-26
      • 2011-07-04
      相关资源
      最近更新 更多