使用Jackson API和JAXB Annotations将JSON转换为XML,反之亦然 [英] Converting JSON to XML and vice versa using Jackson API and JAXB Annotations

查看:205
本文介绍了使用Jackson API和JAXB Annotations将JSON转换为XML,反之亦然的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我正在尝试编写一个代码,它可以分别使用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屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆