Java 将Json转换为Xml的最简单方法
我在.net中有web服务。当我从数据库中检索数据时,它返回Android Mobile中的JSON文件。如何将JSON文件转换为XML或文本。android中没有可用于将JSON转换为XML的直接转换API。首先需要解析JSON,然后必须编写将其转换为xml的逻辑。对于一个简单的解决方案,我建议,因为它可以通过几行简单的代码将任意复杂的JSON转换为xmlJava 将Json转换为Xml的最简单方法,java,android,xml,json,Java,Android,Xml,Json,我在.net中有web服务。当我从数据库中检索数据时,它返回Android Mobile中的JSON文件。如何将JSON文件转换为XML或文本。android中没有可用于将JSON转换为XML的直接转换API。首先需要解析JSON,然后必须编写将其转换为xml的逻辑。对于一个简单的解决方案,我建议,因为它可以通过几行简单的代码将任意复杂的JSON转换为xml import org.codehaus.jackson.map.ObjectMapper; import com.fasterxml.j
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;
}
import org.codehaus.jackson.map.ObjectMapper;
导入com.fasterxml.jackson.xml.XmlMapper;
公开课Foo
{
公共字符串名称;
公共酒吧;
公共静态void main(字符串[]args)引发异常
{
//JSON输入:{“name”:“FOO”,“bar”:{“id”:42}
字符串jsonInput=“{\'name\':\'FOO\',\'bar\':{\'id\':42}}”;
ObjectMapper jsonMapper=新的ObjectMapper();
Foo-Foo=jsonMapper.readValue(jsonInput,Foo.class);
XmlMapper XmlMapper=新的XmlMapper();
System.out.println(xmlMapper.writeValueAsString(foo));
//食物42
}
}
分类栏
{
公共int id;
}
此演示使用(较新的1.7.8也可以使用),(尚未与Jackson 1.8兼容)和。标准类在JSON和XML之间双向转换。还有关于如何使用它的问题
转换不是很好,因为它根本不创建XML属性(仅实体),所以XML输出比可能的更大。但是它不需要定义与需要转换的数据结构相匹配的Java类。下面是一个示例,说明如何生成有效的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>
库具有静态方法U.jsonToXml(字符串)
输出:
<?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>
每个
2.
项目ID
美元
企业代码
也许您应该在UI上阅读JavaScript中的JSON并对其进行解析。(并相应地显示)。如果您必须查看并希望这将对您有所帮助。下划线-java库有一个静态方法U.jsonToXml(json)。如果我没有/不想要Foo
或任何类怎么办?有一种通用的方法吗?我相信您可以在更高版本(如2.1.1)中使用MapNote XmlMapper包,即com.fasterxml.jackson.dataformat.xml.XmlMapper。它会生成无效的xml.dead链接。不起作用。修复了链接并添加了教程。这是一个很好且有用的答案,但如果我们能够摆脱XML输出中的XML包装或类似的XML包装,那就更好了。实际上,我们需要的是JSON到XML的精确转换。
@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);
}
}
import com.github.underscore.lodash.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>