【问题标题】:How to convert XML to JSON in Java and avoid the parser to attempt parsing String as numbers如何在 Java 中将 XML 转换为 JSON 并避免解析器尝试将字符串解析为数字
【发布时间】:2015-12-30 04:12:42
【问题描述】:

我正在使用 org.json.XML 库将 XML 解析为 JSON。 http://www.json.org/javadoc/org/json/XML.html

在我的 XML 文档中有一个使用 [0-9][a-z] 随机生成的 ID 字段。它旨在成为一个字符串。一切正常,直到这个不幸的 ID 123456789e1234 恰好是一个数字的科学记数法。 下面是一段测试代码:

public class XmlToJsonTest {
    public static String testXML = "<MyXML><ID>123456789e1234</ID></MyXML>";
    @Test
    public void testXMLtoJSON() throws JSONException {
        JSONObject testJsonObject = XML.toJSONObject(testXML);
    }
}

这是一个例外:

org.json.JSONException: JSON does not allow non-finite numbers.

XML lib toJson() 方法首先尝试将 String 转换为 Integer、Long 或 Double,如果没有成功,它会放弃将其解析为数字并将其视为 String。在这种情况下,字符串 123456789e1234 可解析为 Double。稍后当 lib 通过 Double.isInfinite() 检查 double 是否为无限时,它会抛出 JSONException,因为显然 123456789e1234 大于 Double 的有限标准。

如何强制它根本不将值解析为数字?在这种情况下,是否有任何 Java 库可以将 XML 正确转换为 JSON?

【问题讨论】:

  • 如何解析号码中的字符“e”?
  • 因为new Double("123456789e1234") 有效。显然它适用于科学记数法。
  • 如果你使用的是XML.toJSONObject(String),那么XmlToJson.toJson是什么?
  • 啊,XmlToJson 是我的助手类,它基本上在XmlToJson.toJson() 中调用XML.toJSONObject()。修改了代码。
  • Underscore-java 库会将其转换为字符串。

标签: java json xml parsing


【解决方案1】:

试试这个...

import org.json.me.JSONObject;

import cjm.component.cb.json.ToJSON;

public class DummyClass
{
public static void main(String[] args)
{
    try
    {
        String xml = "<MyXML><ID>123456789e1234</ID></MyXML>";

        JSONObject obj = (new ToJSON().convertToJSON(xml));

        System.out.println(obj);
    }
    catch (Exception e)
    {
        e.printStackTrace();
    }
}
}

输出

 -------- XML Detected -------- 
 -------- JSON created Successfully -------- 
{"MyXML":{"ID":"123456789e1234"}}

为此获取Conversion Box Jar ....

【讨论】:

    【解决方案2】:

    不确定,但这对我有用:

    String testXML = "<MyXML><ID>123456789e1234</ID></MyXML>";
    JSONObject testJsonObject = org.json.XML.toJSONObject(testXML);
    System.out.println(testJsonObject.getJSONObject("MyXML").getString("ID"));
    

    【讨论】:

    • 如果数字是纯 int/long/double 像1234,这是完全无效的。你会得到JSONObject["ID"] 而不是字符串。
    【解决方案3】:

    有一个带有静态方法U.xmlToJson(xml)underscore-java 库。我是项目的维护者。

    public class XmlToJsonTest {
        public static String testXML = "<MyXML><ID>123456789e1234</ID></MyXML>";
    
        public void main(String[] args) {
            String testJson = U.xmlToJson(testXML);
            System.out.println(testJson);
        }
    }
    

    输出:

    {
      "MyXML": {
        "ID": "123456789e1234"
      },
      "#omit-xml-declaration": "yes"
    }
    

    【讨论】:

      【解决方案4】:

      如果需要将XML解析为String,可以将第二个参数作为XMLParserConfiguration.KEEP_STRINGS传递给XML.toJSONObject

      public static void main(String[] args) {
          System.out.println(XML.toJSONObject("<MyXML><ID>123456789e1234</ID></MyXML>", XMLParserConfiguration.KEEP_STRINGS));
      }
      

      输出

      {"MyXML":{"ID":"123456789e1234"}}
          
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2013-11-08
        • 1970-01-01
        • 2011-01-04
        • 1970-01-01
        • 1970-01-01
        • 2013-12-16
        • 2020-02-05
        • 1970-01-01
        相关资源
        最近更新 更多