有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

java使用Jackson API和JAXB注释将JSON转换为XML,反之亦然

我正在尝试编写一个代码,它可以分别接受XML或JSON输入和输出JSON或XML。也就是说,如果我给出XML,它应该返回JSON,如果我给出JSON,它应该给出XML输出

有人告诉我,使用jacksonapi和JAXB注释可以做到这一点。有人能帮我解决这个问题吗


共 (2) 个答案

  1. # 1 楼答案

    当然可以,但不要认为这是在XML和JSON之间进行转换——这几乎是错误的做法,会导致兼容性问题,但会导致Java对象(POJO)与JSON和XML之间的转换。您可以使用一两种工具来实现这一点:一种常见的组合是使用Jackson来表示JSON,使用JAXB来表示XML,以利用它们各自的优势

    也可以使用单个工具;Blaise解释了JAXB实现如何提供帮助。 类似地,您可以同时使用Jackson:对于XML部分,您需要使用Jackson XML module。 对于Jackson,您可以使用Jackson自己的注释(首选),或JAXB注释以实现兼容性;两者都适用于XML和JSON用例

    在Jackson中使用XML模块与默认的JSON处理没有太大区别,只是需要ObjectMapperXmlMapper子类。 如果从JAX-RS(比如Jersey)使用它,可以使用Jackson JAX-RS XML provider

  2. # 2 楼答案

    注意:我是EclipseLink JAXB (MOXy)领导和JAXB (JSR-222)专家组成员

    下面是一个如何使用MOXy的JSON绑定来支持此用例的示例

    JAVA模型

    下面是一个用JAXB元数据注释的域模型示例。相同的元数据将用于对象到XML和对象到JSON的转换

    客户

    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;
    
    }
    

    电话号码

    import javax.xml.bind.annotation.*;
    
    @XmlAccessorType(XmlAccessType.FIELD)
    public class PhoneNumber {
    
        @XmlAttribute
        private String type;
    
        @XmlValue
        private String number;
    
    }
    

    XML输入

    下面是我们将使用的XML输入。请注意xsi:nil属性是如何在lastName元素上用于指示null值的。还要注意phoneNumbers元素如何具有type属性

    <?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>
    

    演示代码

    jaxb。属性

    要将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
    

    演示

    下面的演示代码将XML转换为域模型,然后再转换回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输出

    请注意lastName键的null值如何表示为正确的JSON。还要注意type键如何不包含任何与之对应的特殊指示符,该指示符是XML表示中的XML属性

    {
       "id" : 123,
       "firstName" : "Jane",
       "lastName" : null,
       "phoneNumbers" : [ {
          "type" : "work",
          "value" : "555-1111"
       } ]
    }