在Java中将XML转换为JSON的最快方法


171

有什么好的工具可以在Java中快速轻松地将XML转换为JSON?


由于规范中的要求,我不能直接使用XML,但我同意您的看法。谢谢!
BeachRunnerFred,

@BeachRunnerJoe:我需要写什么导入内容?import net.sf.json.JSONObject;import org.json.JSONObject;。我还需要包括哪个罐子?
Fahim Parkar 2012年

1
下面是一个方法的链接做到这一点,没有任何依赖性,使用JAXP:stackoverflow.com/questions/27222992/...
bvdb

16
我喜欢SO的封闭式问题,它们具有很高的知名度...如果封闭了这样一个有用的问题,某处出了问题。
Dariusz

2
我认为90%的最有用的问题是“封闭的话题” ..smh
Jery​​l Cook

Answers:


188

Java中的 JSON有一些很棒的资源。

Maven的依赖:

<dependency>
  <groupId>org.json</groupId>
  <artifactId>json</artifactId>
  <version>20180813</version>
</dependency>

XML.java 是您要寻找的课程:

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

public class Main {

    public static int PRETTY_PRINT_INDENT_FACTOR = 4;
    public static String TEST_XML_STRING =
        "<?xml version=\"1.0\" ?><test attrib=\"moretest\">Turn this to JSON</test>";

    public static void main(String[] args) {
        try {
            JSONObject xmlJSONObj = XML.toJSONObject(TEST_XML_STRING);
            String jsonPrettyPrintString = xmlJSONObj.toString(PRETTY_PRINT_INDENT_FACTOR);
            System.out.println(jsonPrettyPrintString);
        } catch (JSONException je) {
            System.out.println(je.toString());
        }
    }
}

输出为:

{"test": {
    "attrib": "moretest",
    "content": "Turn this to JSON"
}}

14
警告:json.org.XML包在Android中不存在!
Ludovic Landry

2
@danieltalsky:我需要写什么导入内容?import net.sf.json.JSONObject;import org.json.JSONObject;。我还需要包括哪个罐子?
Fahim Parkar 2012年

2
下载所有文件,而不仅仅是XML.java。从这里:github.com/douglascrockford/JSON-java/downloads
Spiff 2012年

4
如果您有<test attrib="moretest" content="foo">bar</test>
wchargin

1
注意:org.json的XML.toJSONObject()也可以正确地将xml列表转换为json数组(与杰克逊的XmlMapper不同,默认情况下它默默地吞咽)。
Agoston Horvath

58

要将XML文件转换为JSON,请包含以下依赖项

<dependency>
    <groupId>org.json</groupId>
    <artifactId>json</artifactId>
    <version>20140107</version>
</dependency>

您可以在此处从Maven Repository下载Jar。然后实现为:

String soapmessageString = "<xml>yourStringURLorFILE</xml>";
JSONObject soapDatainJsonObject = XML.toJSONObject(soapmessageString);
System.out.println(soapDatainJsonObject);

5
+提供了对Maven的依赖
zacheusz 2015年

2
如果您使用的是Java 7,请使用帖子中提到的json版本,因为最新版本会引发奇怪的错误。
2015年

如果您有适用于xml代码段的有效dtd文件,则可以使用开源eclipse链接jar轻松地将xml转换为json并将json转换为xml。可以在以下位置找到详细的Java示例项目示例:cubicrace.com/2015/06/How-to-convert-XML-to-JSON-format.html
Piyush Chordia,2016年

我必须将整个JSON包复制到我的项目中,然后将其重命名。添加到gradle会在构建期间警告来自Android的重复软件包。
codelearner

28

Java中JSON的唯一问题是,如果您的XML有一个孩子,但是是一个数组,它将把它转换为对象而不是数组。如果您总是动态地将XML转换为JSON,这可能会导致问题;如果示例XML仅具有一个元素,则返回一个对象,但是如果其具有2+,则返回一个数组,这可能会导致使用JSON。

Infoscoop的XML2JSON类提供了一种在转换之前标记数组元素的方法,即使XML中只有一个子元素,也可以正确映射数组。

这是一个使用它的示例(语言稍有不同,但是您也可以从XML2JSON链接的nodelist2json()方法中看到如何使用数组)。


我们正在python中使用“ xml-to-json”库,这是一个语义问题。解决此“数组或对象”问题的方法是编写“ tryConvertToArray()”方法,该方法返回其中包含单个对象的数组。因此,您始终可以相信自己的价值是一个数组
kommradHomer 2013年

我不清楚这如何解决问题。您是否只是将所有内容都做成数组而不是对象?例如,如果我有XML <results><result><value>1</value></result></results>,它会产生 { "results" : { "result" : { "value" : "1" } } }{ "results" : [ { "result" : { "value" : "1" } } ] }
马库斯

我们期望它是一个数组。当此数组只有1个元素时,就会出现问题,使其成为xml-to-json转换器的对象。因此,由于我们期望这甚至是单个元素的数组,因此我们将其检查并转换为数组,确保我们在期望数组的位置有一个数组。
kommradHomer

但是,您如何期望特定元素成为数组?XML2JSON标记元素。目前尚不清楚如何在不加标签的情况下将其期望为数组,因为否则您将永远不会知道单个元素“ array”。
Marcus

例如,有一个元素称为“ phonenumbers”。在“ phonenumbers”元素中有1个或多个“ phonenumber”元素。因此,当“ phonenumbers”中仅存在一个“ phonenumber”元素时,xml2json创建了一个phonenumber对象,但是我创建了一个phonenumber数组并将该phonenumber对象放入其中。
kommradHomer 2013年


2

我找到了快速简便的方法:用过的:org.json.XMLjava-json.jar中的类

if (statusCode == 200 && inputStream != null) {
    BufferedReader bufferedReader = new BufferedReader(new InputStreamReader(inputStream, "UTF-8"));
    StringBuilder responseStrBuilder = new StringBuilder();

    String inputStr;
    while ((inputStr = bufferedReader.readLine()) != null) {
        responseStrBuilder.append(inputStr);
    }

    jsonObject = XML.toJSONObject(responseStrBuilder.toString());
}

1

我不知道您的确切问题是什么,但是如果您正在接收XML并想返回JSON(或其他内容),则还可以查看JAX-B。这是将Java POJO编组/解编为XML和/或Json的标准。有许多实现JAX-B的库,例如Apache的CXF。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.