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

15

我有一个用 .net 编写的 Web 服务。当从数据库检索数据时,在 Android 手机上返回 JSON 文件。如何将 JSON 文件转换为 XML 或文本格式?


也许你应该在UI上使用JavaScript读取JSON并解析它(然后相应地显示)。如果必要可以点击这里查看(http://www.webmasterworld.com/javascript/3540648.htm) - Nishant
请查看这个这个,希望能对您有所帮助。 - Sandy
Underscore-java库有一个静态方法U.jsonToXml(json)。 - Valentyn Kolesnikov
5个回答

10

对于一个简单的解决方案,我推荐使用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


3
如果我没有或不想要Foo或任何类,那该怎么办?有通用的方法吗? - Martynas Jusevičius
1
我相信你可以使用Map<String, Object>。 - Alessandro Scarlatti
请注意,较新版本(例如2.1.1)中的XmlMapper包是com.fasterxml.jackson.dataformat.xml.XmlMapper。 - Woodchuck

5
这里有一个例子,展示如何生成有效的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输出中摆脱<LinkedHashMap>或类似的XML包装器,那就更好了。实际上,我们需要的是将JSON精确转换为XML。 - Levent Divilioglu

1

标准的org.json.XML类可以在JSON和XML之间进行双向转换。同时,还有tutorial介绍如何使用它。

转换效果不是很好,因为它根本不创建XML属性(只有实体),所以XML输出比可能更加臃肿。但是,它不需要定义与需要转换的数据结构相匹配的Java类。


它生成了无效的XML。 - Martynas Jusevičius
修复了链接并添加了教程。 - Audrius Meškauskas

1

在Android中没有直接的转换API可用于将JSON转换为XML。您需要首先解析JSON,然后编写逻辑将其转换为XML。


0

Underscore-java库有静态方法U.jsonToXml(string)。实时示例

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>

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