使用Marshaller将Java对象转换为XML相当容易。但是我需要单独使用marshaller将Java对象转换为JSON。我知道像使用gson或Xstream这样的东西很好,但是我需要使用Marshaller。如何实现呢?
提前致谢。
注意: 我是 EclipseLink JAXB(MOXy)的 负责人,并且是 JAXB(JSR-222) 专家组的成员,
如果将MOXy用作JAXB提供程序,以下是如何完成的。
JAVA模型
顾客
import java.util.*; import javax.xml.bind.annotation.*; @XmlRootElement(namespace="http://www.example.com") @XmlType(namespace="http://www.example.com") @XmlAccessorType(XmlAccessType.FIELD) public class Customer { @XmlAttribute private int id; @XmlElement(namespace="http://www.example.com") private String firstName; @XmlElement(namespace="http://www.example.com", nillable=true) private String lastName; @XmlElement(namespace="http://www.example.com") private List<PhoneNumber> phoneNumbers = new ArrayList<PhoneNumber>(); }
电话号码
import javax.xml.bind.annotation.*; @XmlAccessorType(XmlAccessType.FIELD) public class PhoneNumber { @XmlAttribute private String type; @XmlValue private String number; }
jaxb.properties
要将MOXy指定为JAXB提供程序,您需要jaxb.properties在与域模型相同的程序包中包含一个名为的文件,并包含以下条目(请参阅:http : //blog.bdoughan.com/2011/05/specifying- eclipselink-moxy-as -your.html)
javax.xml.bind.context.factory=org.eclipse.persistence.jaxb.JAXBContextFactory
演示代码
input.xml
<?xml version="1.0" encoding="UTF-8"?> <ns0:customer xmlns:ns0="http://www.example.com" id="123"> <ns0:firstName>Jane</ns0:firstName> <ns0:lastName xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:nil="true"/> <ns0:phoneNumbers type="work">555-1111</ns0:phoneNumbers> </ns0:customer>
演示版
在下面的演示代码中,我们将使用相同的JAXB元数据将XML文档转换为Java对象,然后将这些对象转换回JSON。使用MOXy,您可以通过在上设置属性来指定JSON输出Marshaller。
Marshaller
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/forum15357366/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输出
以下是JSON输出。注意,没有名称空间或XML属性对应的指示符。还要注意,大小为1的集合已正确表示为JSON数组(其他方法存在的问题)。
{ "id" : 123, "firstName" : "Jane", "lastName" : null, "phoneNumbers" : [ { "type" : "work", "value" : "555-1111" } ] }