使用Jackson API和JAXB Annotations将JSON转换为XML,反之亦然 [英] Converting JSON to XML and vice versa using Jackson API and JAXB Annotations
问题描述
我正在尝试编写一个代码,它可以分别使用XML或JSON输入并输出JSON或XML。即,如果我提供XML,它应该返回JSON,如果我给JSON,它应该给出XML输出。
I'm trying to write a code which can take either XML or JSON input and output JSON or XML respectively. I.e, if I give XML it should give back JSON, and if I give JSON it should give XML output.
我被告知使用Jackson API和JAXB Annotations可以实现这一点。任何人都可以帮我解决这个问题吗?
I was told this is possible using Jackson API and JAXB Annotations. Can anyone help me out with this?
推荐答案
注意:我是 EclipseLink JAXB(MOXy) 领导和 JAXB(JSR-222) 专家组。
Note: I'm the EclipseLink JAXB (MOXy) lead and a member of the JAXB (JSR-222) expert group.
下面是一个如何使用MOXy的JSON绑定来支持这个用例的例子。
Below is an example of how you can use MOXy's JSON-binding to support this use case.
JAVA MODEL
以下是使用JAXB元数据注释的示例域模型。相同的元数据将用于对象到XML和对象到JSON的转换。
Below is an example domain model annotated with JAXB metadata. The same metadata will be used for both the object-to-XML and object-to-JSON conversions.
客户
Customer
import java.util.List;
import javax.xml.bind.annotation.*;
@XmlRootElement
@XmlAccessorType(XmlAccessType.FIELD)
public class Customer {
private int id;
private String firstName;
@XmlElement(nillable=true)
private String lastName;
private List<PhoneNumber> phoneNumbers;
}
PhoneNumber
PhoneNumber
import javax.xml.bind.annotation.*;
@XmlAccessorType(XmlAccessType.FIELD)
public class PhoneNumber {
@XmlAttribute
private String type;
@XmlValue
private String number;
}
XML INPUT
以下是我们将使用的XML输入。注意如何在 lastName
元素上使用 xsi:nil
属性来指示 null
价值。另请注意 phoneNumbers
元素如何具有类型
属性。
Below is the XML input that we will use. Note how the xsi:nil
attribute is used on the lastName
element to indicate a null
value. Also note how the phoneNumbers
element has a type
attribute.
<?xml version="1.0" encoding="UTF-8"?>
<customer>
<id>123</id>
<firstName>Jane</firstName>
<lastName xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:nil="true"/>
<phoneNumbers type="work">555-1111</phoneNumbers>
</customer>
DEMO CODE
jaxb.properties
jaxb.properties
要将MOXy指定为JAXB提供程序,您需要包含一个名为<的文件code> jaxb.properties 与您的域模型在同一个包中,并带有以下条目(请参阅: http://blog.bdoughan.com/2011/05/specifying-eclipselink-moxy-as-your.html ):
To specify MOXy as your JAXB provider you need to include a file called jaxb.properties
in the same package as your domain model with the following entry (see: http://blog.bdoughan.com/2011/05/specifying-eclipselink-moxy-as-your.html):
javax.xml.bind.context.factory=org.eclipse.persistence.jaxb.JAXBContextFactory
演示
Demo
以下演示代码将XML转换为域模型,然后再转换回JSON。
The following demo code will convert the XML to the domain model and then back to JSON.
import java.io.File;
import javax.xml.bind.*;
import org.eclipse.persistence.jaxb.MarshallerProperties;
public class Demo {
public static void main(String[] args) throws Exception {
JAXBContext jc = JAXBContext.newInstance(Customer.class);
Unmarshaller unmarshaller = jc.createUnmarshaller();
File xml = new File("src/forum14734741/input.xml");
Customer customer = (Customer) unmarshaller.unmarshal(xml);
Marshaller marshaller = jc.createMarshaller();
marshaller.setProperty(Marshaller.JAXB_FORMATTED_OUTPUT, true);
marshaller.setProperty(MarshallerProperties.MEDIA_TYPE, "application/json");
marshaller.setProperty(MarshallerProperties.JSON_INCLUDE_ROOT, false);
marshaller.marshal(customer, System.out);
}
}
JSON OUTPUT
注意 lastName
null 值> key表示为正确的JSON。另请注意类型
键如何不包含任何与XML表示中的XML属性相对应的特殊指示符。
Note how the null
value for the lastName
key is represented as proper JSON. Also note how the type
key doesn't contain any special indicator corresponding to it being an XML attribute in the XML representation.
{
"id" : 123,
"firstName" : "Jane",
"lastName" : null,
"phoneNumbers" : [ {
"type" : "work",
"value" : "555-1111"
} ]
}
这篇关于使用Jackson API和JAXB Annotations将JSON转换为XML,反之亦然的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!