将 Json 转换为 Xml 的最简单方法
Posted
技术标签:
【中文标题】将 Json 转换为 Xml 的最简单方法【英文标题】:Simplest method to Convert Json to Xml 【发布时间】:2011-10-08 05:36:43 【问题描述】:我在 .net 中有网络服务。当我从数据库中检索数据时,它会在 android Mobile 中返回 JSON 文件。如何将 JSON 文件转换为 XML 或文本。
【问题讨论】:
也许你应该在你的 UI 上阅读 javascript 中的 JSON 并解析它。 (并相应地显示)。如果你必须看到here 查看this 和this 希望这会对您有所帮助。 Underscore-java库有一个静态方法U.jsonToXml(json)。 【参考方案1】:对于一个简单的解决方案,我推荐Jackson,因为它可以通过几行简单的代码将任意复杂的 JSON 转换为 XML。
import org.codehaus.jackson.map.ObjectMapper;
import com.fasterxml.jackson.xml.XmlMapper;
public class Foo
public String name;
public Bar bar;
public static void main(String[] args) throws Exception
// JSON input: "name":"FOO","bar":"id":42
String jsonInput = "\"name\":\"FOO\",\"bar\":\"id\":42";
ObjectMapper jsonMapper = new ObjectMapper();
Foo foo = jsonMapper.readValue(jsonInput, Foo.class);
XmlMapper xmlMapper = new XmlMapper();
System.out.println(xmlMapper.writeValueAsString(foo));
// <Foo xmlns=""><name>FOO</name><bar><id>42</id></bar></Foo>
class Bar
public int id;
此演示使用Jackson 1.7.7(较新的 1.7.8 也应该可以使用)、Jackson XML Databind 0.5.3(尚不兼容 Jackson 1.8)和 Stax2 3.1.1。
【讨论】:
如果我没有/不想要Foo
或任何课程怎么办?有通用的方法吗?
我相信你可以使用 Map这是一个示例,说明如何执行此操作,生成有效的 XML。我还在一个 Maven 项目中使用 Jackson 库。
Maven 设置:
<!-- https://mvnrepository.com/artifact/com.fasterxml/jackson-xml-databind -->
<dependency>
<groupId>com.fasterxml</groupId>
<artifactId>jackson-xml-databind</artifactId>
<version>0.6.2</version>
</dependency>
<!-- https://mvnrepository.com/artifact/com.fasterxml.jackson.core/jackson-databind -->
<dependency>
<groupId>com.fasterxml.jackson.core</groupId>
<artifactId>jackson-databind</artifactId>
<version>2.8.6</version>
</dependency>
这是一些 Java 代码,它首先将 JSON 字符串转换为对象,然后使用 XMLMapper 将对象转换为 XML,并删除任何错误的元素名称。在 XML 元素名称中替换错误字符的原因是您可以在 JSON 元素名称中使用 $oid 等 XML 中不允许的字符。 Jackson 库没有考虑到这一点,所以我最终添加了一些代码,这些代码从元素名称和命名空间声明中删除了非法字符。
import com.fasterxml.jackson.core.type.TypeReference;
import com.fasterxml.jackson.databind.ObjectMapper;
import com.fasterxml.jackson.xml.XmlMapper;
import java.io.IOException;
import java.util.Map;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
/**
* Converts JSON to XML and makes sure the resulting XML
* does not have invalid element names.
*/
public class JsonToXMLConverter
private static final Pattern XML_TAG =
Pattern.compile("(?m)(?s)(?i)(?<first><(/)?)(?<nonXml>.+?)(?<last>(/)?>)");
private static final Pattern REMOVE_ILLEGAL_CHARS =
Pattern.compile("(i?)([^\\s=\"'a-zA-Z0-9._-])|(xmlns=\"[^\"]*\")");
private ObjectMapper mapper = new ObjectMapper();
private XmlMapper xmlMapper = new XmlMapper();
String convertToXml(Object obj) throws IOException
final String s = xmlMapper.writeValueAsString(obj);
return removeIllegalXmlChars(s);
private String removeIllegalXmlChars(String s)
final Matcher matcher = XML_TAG.matcher(s);
StringBuffer sb = new StringBuffer();
while(matcher.find())
String elementName = REMOVE_ILLEGAL_CHARS.matcher(matcher.group("nonXml"))
.replaceAll("").trim();
matcher.appendReplacement(sb, "$first" + elementName + "$last");
matcher.appendTail(sb);
return sb.toString();
Map<String, Object> convertJson(String json) throws IOException
return mapper.readValue(json, new TypeReference<Map<String, Object>>());
public String convertJsonToXml(String json) throws IOException
return convertToXml(convertJson(json));
这是 convertJsonToXml 的 JUnit 测试:
@Test
void convertJsonToXml() throws IOException, ParserConfigurationException, SAXException
try(InputStream in = Thread.currentThread().getContextClassLoader().getResourceAsStream("json/customer_sample.json"))
String json = new Scanner(in).useDelimiter("\\Z").next();
String xml = converter.convertJsonToXml(json);
DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance();
DocumentBuilder db = dbf.newDocumentBuilder();
Document doc = db.parse(new ByteArrayInputStream(xml.getBytes("UTF-8")));
Node first = doc.getFirstChild();
assertNotNull(first);
assertTrue(first.getChildNodes().getLength() > 0);
【讨论】:
这是一个不错且有用的答案,但如果我们可以摆脱 XML 输出中的 或类似的 XML 包装器,那就更好了。实际上,我们需要的是 JSON 到 XML 的精确转换。【参考方案3】:android 中没有直接转换 API 可用于将 JSON 转换为 XML。您需要先解析 JSON,然后您必须编写将其转换为 xml 的逻辑。
【讨论】:
【参考方案4】:标准org.json.XML 类在 JSON 和 XML 之间双向转换。还有tutorial如何使用。
转换不是很好,因为它根本不创建 XML 属性(仅实体),因此 XML 输出比可能的要庞大。但它不需要定义与需要转换的数据结构相匹配的Java类。
【讨论】:
生成无效的 XML。 修复链接并添加教程【参考方案5】:Underscore-java 库有静态方法 U.jsonToXml(string)。 Live example
import com.github.underscore.U;
public class MyClass
public static void main(String args[])
String json = "\"Price\": "
+ " \"LineItems\": "
+ " \"LineItem\": "
+ " \"UnitOfMeasure\": \"EACH\", \"Quantity\": 2, \"ItemID\": \"ItemID\""
+ " "
+ " ,"
+ " \"Currency\": \"USD\","
+ " \"EnterpriseCode\": \"EnterpriseCode\""
+ "";
System.out.println(U.jsonToXml(json));
输出:
<?xml version="1.0" encoding="UTF-8"?>
<Price>
<LineItems>
<LineItem>
<UnitOfMeasure>EACH</UnitOfMeasure>
<Quantity number="true">2</Quantity>
<ItemID>ItemID</ItemID>
</LineItem>
</LineItems>
<Currency>USD</Currency>
<EnterpriseCode>EnterpriseCode</EnterpriseCode>
</Price>
【讨论】:
以上是关于将 Json 转换为 Xml 的最简单方法的主要内容,如果未能解决你的问题,请参考以下文章