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

187

有哪些在Java中快速轻松将XML转换为JSON的好工具?


非常感谢您的问题。 - Pankaj Nimgade
1
这是一个使用JAXP且不需要任何依赖库的方法将XML字符串转换为JSON字符串的链接: http://stackoverflow.com/questions/27222992/convert-xml-string-to-json-string-without-using-third-party-libs/30807545#30807545 - bvdb
如果您有XML片段的有效DTD文件,则可以使用开源Eclipse Link JAR轻松将XML转换为JSON,以及将JSON转换为XML。详细的JAVA示例项目可以在此处找到:cubicrace.com/2015/06/How-to-convert-XML-to-JSON-format.html - Piyush Chordia
27
我喜欢SO上那些能够高度展示的已关闭问题...如果这样一个有用的问题被关闭了,一定是哪里出了问题。 - Dariusz
4
我认为最有用的问题中有90%是“关闭话题”…… 唉 - Jeryl Cook
显示剩余3条评论
6个回答

214
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;
import org.json.JSONException;

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
警告:在Android中不存在"json.org.XML"包! - Ludovic Landry
2
@danieltalsky:我需要写哪个导入语句?import net.sf.json.JSONObject; 还是 import org.json.JSONObject;。此外,我需要包含哪个jar文件? - Fahim Parkar
2
仅下载XML.java文件。从这里开始:https://github.com/douglascrockford/JSON-java/downloads - Spiff
4
如果你有一个 <test attrib="moretest" content="foo">bar</test>,该怎么办? - wchargin
1
注意:org.json的XML.toJSONObject()方法还可以正确地将XML列表转换为JSON数组(这与Jackson的XmlMapper不同,后者默认情况下会默默地吞噬)。 - Agoston Horvath
显示剩余6条评论

63

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

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

您可以从Maven仓库下载JAR文件,然后按以下方式进行实现:

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

6
为Maven依赖项提供的“+”意味着将使用最新版本的依赖项,前提是该版本符合在POM文件中声明的版本限制。 - zacheusz
2
如果您正在使用Java 7,则请使用帖子中提到的json版本,因为最新版本会抛出奇怪的错误。 - urug
如果你有一个有效的DTD文件用于XML片段,那么你可以很容易地使用开源Eclipse Link JAR将XML转换为JSON和JSON转换为XML。详细的JAVA示例项目可以在这里找到:http://www.cubicrace.com/2015/06/How-to-convert-XML-to-JSON-format.html - Piyush Chordia
我不得不将整个JSON包复制到我的项目中并重命名该包。在gradle中添加后,在构建过程中会收到来自Android的重复包警告。 - codelearner

32
唯一的问题是,如果你的XML只有一个子元素,但是是一个数组,Java中的JSON会将其转换为对象而不是数组。如果你总是从XML动态地转换到JSON,这可能会导致问题,例如,如果你的示例XML只有一个元素,则返回一个对象,但如果它有2个或更多,则返回一个数组,这可能会导致使用JSON的人遇到解析问题。
Infoscoop的XML2JSON类在进行转换之前有一种标记数组元素的方法,以便可以正确映射数组,即使XML中只有一个子元素。
以下是一个示例的使用(使用稍微不同的语言,但您也可以看到如何从XML2JSON链接的nodelist2json()方法中使用数组)。

我不清楚这如何解决问题。你只是将所有东西都变成数组而不是对象吗?例如,如果我有XML <results><result><value>1</value></result></results>,它会生成{ "results" : { "result" : { "value" : "1" } } }还是{ "results" : [ { "result" : { "value" : "1" } } ] } - Marcus
我们期望某个变量是一个数组。问题出现在这个数组只有一个元素时,它会被 XML-to-JSON 转换器解释成对象。因此,为了确保即使只有一个元素时也能按照数组方式处理,我们需要检查并转换该变量为数组,以确保在期望数组的地方始终得到一个数组。 - kommradHomer
明白了,这也是 XML2JSON 的工作原理。然而,大多数解析器会认为“phonenumbers”是一个数组,而不是一个对象。你的解决方案难道不会在只包含一个电话号码元素时将“phonenumbers”变成一个数组吗?大多数 JSON 的使用者不会经常检查它是数组还是对象,并假定它是数组,导致在“phonenumbers”中只有一个“phonenumber”时出现问题。 - Marcus
@StackOverFlow 只需将其设置为字符串类型即可。 - xydev
@xydev 请查看http://stackoverflow.com/questions/18121714/xml-to-json-conversion-issue-in-java-1st-leading-zero-discarded-fom-string#comment26539320_18121714 - StackOverFlow
显示剩余6条评论

4
我找到了一种快速简单的方法: 使用了java-json.jar中的org.json.XML类。
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());
}

3

如果有人需要在线工具,这里有一个:https://json2csharp.com/xml-to-java - Hilal

2

我不知道你的确切问题是什么,但如果你收到XML并想返回JSON(或其他内容),你也可以看看JAX-B。这是将Java POJO转换为XML和/或Json的标准。有多个库实现了JAX-B,例如Apache的CXF。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接