Java中将JSON转换为XML

61

我对json还不熟悉。我正在编写一个程序,将json对象生成xml。

String str = "{'name':'JSON','integer':1,'double':2.0,'boolean':true,'nested':{'id':42},'array':[1,2,3]}";  
    JSON json = JSONSerializer.toJSON( str );  
    XMLSerializer xmlSerializer = new XMLSerializer();  
    xmlSerializer.setTypeHintsCompatibility( false );  
    String xml = xmlSerializer.write( json );  
    System.out.println(xml); 

输出结果为:

<?xml version="1.0" encoding="UTF-8"?>
<o><array json_class="array"><e json_type="number">1</e><e json_type="number">2</e><e json_type="number">3</e></array><boolean json_type="boolean">true</boolean><double json_type="number">2.0</double><integer json_type="number">1</integer><name json_type="string">JSON</name><nested json_class="object"><id json_type="number">42</id></nested></o>

我的最大问题是如何编写自己的属性(而不是json_type="number"之类的)以及编写自己的子元素,比如 <my-element>。


Vinod,你有解决上面的问题吗,“将自己的属性写入从JSON生成的XML标记”?如果你找到了解决方案,请在这个帖子中发布。提前致谢。 - Malleswari
@Malleswari 你可以将JSON转换为Map,进行修改,然后再转换回来。 - Valentyn Kolesnikov
6个回答

136

使用来自json.org的(出色的)JSON-Java库,然后...

JSONObject json = new JSONObject(str);
String xml = XML.toString(json);

toString可以接受第二个参数,以提供XML根节点的名称。

该库还能够使用XML.toJSONObject(java.lang.String string)将XML转换为JSON。

查看Javadoc文档

链接到GitHub代码库

POM

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

已更新原始帖子链接


1
谢谢。如何编写JSON对象以向元素添加属性,例如<Private Provider="AB"/>。 - vinod
我猜想唯一的方法就是将JSON反序列化为(自定义的)Java对象。然后,使用像XMLBeans或XStream这样的框架,并借助注释来指定哪个属性作为元素,哪个属性作为属性。 - Bruno Grieder
或者,使用上面简单的两行代码中的XML,并对其应用XSLT。 - Bruno Grieder
1
非常方便的一对一JSON到XML转换。 - Christophe Roussy
2
这对我不起作用,我从有效的JSON中得到无效的XML。 - Fabian Zeindl
显示剩余8条评论

8

Underscore-java库有一个静态方法U.jsonToXml(jsonstring)实时示例

import com.github.underscore.U;

public class MyClass {
    public static void main(String args[]) {
        String json = "{\"name\":\"JSON\",\"integer\":1,\"double\":2.0,\"boolean\":true,\"nested\":{\"id\":42},\"array\":[1,2,3]}";

        String xml = U.jsonToXml(json, U.JsonToXmlMode.REMOVE_ATTRIBUTES);
        System.out.println(xml);
    }
}

输出:

{"name":"JSON","integer":1,"double":2.0,"boolean":true,"nested":{"id":42},"array":[1,2,3]}
<?xml version="1.0" encoding="UTF-8"?>
<root>
  <name>JSON</name>
  <integer>1</integer>
  <double>2.0</double>
  <boolean>true</boolean>
  <nested>
    <id>42</id>
  </nested>
  <array>1</array>
  <array>2</array>
  <array>3</array>
</root>

谢谢这个。特别是对于混合的JSON对象数组结构,它比排名第一的答案容易得多。 - DubZ
@Valentyn - 在将Json转换为XML时如何添加 soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/" xmlns:soapenc="http://schemas.xmlsoap.org/soap/encoding/" - PAA
1
谢谢。这是2020年最佳解决方案。其他一些库不起作用。 - Dinith Rukshan Kumara

7

将JSON转换为XML,请使用以下Jackson示例:

final String str = "{\"name\":\"JSON\",\"integer\":1,\"double\":2.0,\"boolean\":true,\"nested\":{\"id\":42},\"array\":[1,2,3]}";
ObjectMapper jsonMapper = new ObjectMapper();
JsonNode node = jsonMapper.readValue(str, JsonNode.class);
XmlMapper xmlMapper = new XmlMapper();
                xmlMapper.configure(SerializationFeature.INDENT_OUTPUT, true);
                xmlMapper.configure(ToXmlGenerator.Feature.WRITE_XML_DECLARATION, true);
                xmlMapper.configure(ToXmlGenerator.Feature.WRITE_XML_1_1, true);
ObjectWriter ow = xmlMapper.writer().withRootName("root");
StringWriter w = new StringWriter();
ow.writeValue(w, node);
System.out.println(w.toString());

输出:

<?xml version='1.1' encoding='UTF-8'?>
<root>
  <name>JSON</name>
  <integer>1</integer>
  <double>2.0</double>
  <boolean>true</boolean>
  <nested>
    <id>42</id>
  </nested>
  <array>1</array>
  <array>2</array>
  <array>3</array>
</root>

要将 XML 转换为 JSON,请查看此答案: https://dev59.com/P4rda4cB1Zd3GeqPQb9O#62468955

最好展示如何覆盖“ObjectNode”。 - Simon Logic
1
@SimonLogic 很好的提示!已添加“功能”。 - jschnasse
有没有一种方法可以将JSON中的对象数组转换为XML中的包装列表?比如JSON中有 "objects": [{"value": 1}, {"value": 2}],是否可能得到 <objects><object><value>1</value></object><object><value>2</value></object></objects> - Elliot Vargas

4

0

据我所知,使用XSLT 3.0进行转换是唯一正确的方法。它保证生成有效的XML,并且具有良好的结构。 https://www.w3.org/TR/xslt/#json


现在,您也可以使用我们的库进行此转换:https://github.com/AtomGraph/JSON2XML - Martynas Jusevičius

-2

如果您想要替换任何节点值,可以使用以下方式:

JSONObject json = new JSONObject(str);
String xml = XML.toString(json);
xml.replace("old value", "new value");

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