最简单的方法将Json转换为Xml

我有.net的networking服务。 当我从数据库中检索数据时,它将返回Android Mobile中的JSON文件。 如何将JSON文件转换为XML或文本。

Solutions Collecting From Web of "最简单的方法将Json转换为Xml"

对于一个简单的解决scheme,我推荐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; } 

这个演示使用jackson1.7.7 (新的1.7.8也应该工作), jacksonXML数据绑定0.5.3 (尚不兼容jackson1.8)和Stax2 3.1.1 。

这里是一个如何做到这一点,生成有效的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> 

以下是一些首先将JSONstring转换为对象的Java代码,然后将该对象与XMLMapper转换为XML,并删除任何错误的元素名称。 在XML元素名称中replace错误字符的原因是,您可以在$ oid中使用JSON元素名称,而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的JUnittesting:

 @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); } } 

在android中没有直接的转换API可以将JSON转换为XML。 您需要首先parsingJSON,然后您将不得不编写逻辑将其转换为xml。

标准的org.json.XML类在JSON和XML之间转换。

转换不是很好,因为它根本不创buildXML属性(仅限实体),所以XML输出比可能的更庞大。 但是它不需要定义匹配需要转换的数据结构的Java类。