【问题标题】:How to convert XML to Json with only STRING type如何仅使用 STRING 类型将 XML 转换为 Json
【发布时间】:2018-03-02 14:33:33
【问题描述】:

我使用 JSONObject 的 toJSONObject() 将 XML 转换为 JSON。但是,对我来说有一个烦人的转换问题。

例如,我的原始 XML 如下所示:

<?xml version="1.0" encoding="UTF-8" standalone="yes"?><testData><Timestamp>20170907005718936</Timestamp><Detail><Item1>02907005718520</Item1><Item2>02907425118520</Item2><Item3>20170921133613</Item3></Detail></testData>

然后我执行以下操作将它们转换为 JSON:

String xml = "<?xml version=\"1.0\" encoding=\"UTF-8\" standalone=\"yes\"?><testData><Timestamp>20170907005718936</Timestamp><Detail><Item1>02907005718520</Item1><Item2>02907425118520</Item2><Item3>20170921133613</Item3></Detail></testData>";
    try {
        JSONObject xmlObj = XML.toJSONObject(xml);
        System.out.println(xmlObj.toString());
    } catch (JSONException e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
    }

转换后,我每个标签内的数据都损坏了,因为它认为它们是NUMBERS,而不是STRING

{"testData":{"Timestamp":20170907005718936,"Detail":{"Item1":2907005718520,"Item2":2907425118520,"Item3":20170921133613}}}

如何将所有标签值仅转换为字符串类型?

【问题讨论】:

  • @CodeMatrix 只是“转换”,而不是我想要的数据类型

标签: java json xml


【解决方案1】:

试试这个,

JSONObject xmlObj = XML.toJSONObject(xml,true);

函数中输入 XML 之后的布尔值将按预期返回结果。

谢谢, 莫拉杰斯

【讨论】:

  • 很遗憾这个解决方案来晚了,所以我会给你点赞
【解决方案2】:

您可以尝试将每个 number 转换为 String,例如:

String xml = "<?xml version=\"1.0\" encoding=\"UTF-8\" standalone=\"yes\"?><testData><Timestamp>20170907005718936</Timestamp><Detail><Item1>02907005718520</Item1><Item2>02907425118520</Item2><Item3>20170921133613</Item3></Detail></testData>";
xml = xml.replaceAll("(?<=\\d+)<", "\"<"); // any < preceded by digits
xml = xml.replaceAll(">(?=\\d+)", ">\""); // any > followed by digits
System.out.println(xml);

输出:

<?xml version="1.0" encoding="UTF-8" standalone="yes"?><testData><Timestamp>"20170907005718936"</Timestamp><Detail><Item1>"02907005718520"</Item1><Item2>"02907425118520"</Item2><Item3>"20170921133613"</Item3></Detail></testData>

编辑:

如果您可能有可能以数字开头/结尾的String 值,您可以指定您的值应该被视为Number 的位数的下限,例如:

xml = xml.replaceAll("(?<=\\d{5})<", "\"<"); // any < preceded by at least 5 digits
xml = xml.replaceAll(">(?=\\d{5})", ">\""); // any > followed by at least 5 digits

【讨论】:

  • 如果值已经是 STRING,这会在我的结果中添加额外的双引号。像 &lt;Item4&gt;Item4&lt;/Item4&gt; 在 XML 到 JSON 转换后会变成 "Item4":"Item4\""。需要调整一下
  • 但你的似乎最接近我的需要。如果接下来几天没有更好的帖子,我会标记你为正确答案。
【解决方案3】:

我认为这可以使用: 类:

public JSONObject() {
    this.map = new LinkedHashMap<String, Object>();
}
 
 
public JSONObject(Map<String, Object> map) {
    this.map = new LinkedHashMap<String, Object>();
    if (map != null) {
        Iterator<Entry<String, Object>> i = map.entrySet().iterator();
        while (i.hasNext()) {
            Entry<String, Object> entry = i.next();
            Object value = entry.getValue();
            if (value != null) {
                this.map.put(entry.getKey(), wrap(value));
            }
        }
    }
}

然后在你的主要:

String xml = FileUtils.readFileToString(new File("test.xml"));
System.out.println(org.json.XML.toJSONObject(xml).toString());

希望对你有帮助! =)

【讨论】:

  • 遗憾的是,这与使用 XML.toJSONObject() 没有区别,我在每个标签值左侧的 0 仍然被修剪。
猜你喜欢
  • 1970-01-01
  • 2017-01-22
  • 1970-01-01
  • 1970-01-01
  • 2016-03-20
  • 1970-01-01
  • 1970-01-01
  • 2019-09-13
  • 1970-01-01
相关资源
最近更新 更多