я сосредоточусь на том, как обрабатывается null в каждом из этих представлений.
Модель предметной области.
По умолчанию реализация JAXB (JSR-222) не будет включать отображенное поле / свойство с нулевым значением в выводе. Если вы хотите, чтобы значение NULL было представлено, просто добавьте следующую аннотацию @XmlElement (nillable = true) .
package blog.json.nillable; import javax.xml.bind.annotation.*; @XmlRootElement public class Customer { private String firstName; private String middleName; private String lastName; public String getFirstName() { return firstName; } public void setFirstName(String firstName) { this.firstName = firstName; } public String getMiddleName() { return middleName; } public void setMiddleName(String middleName) { this.middleName = middleName; } @XmlElement(nillable=true) public String getLastName() { return lastName; } public void setLastName(String lastName) { this.lastName = lastName; } }
Демонстрация
В демонстрационном коде ниже мы установим свойства middleName и lastName в null. Поскольку мы по-разному отобразили эти свойства в модели предметной области, мы рассмотрим выходные данные, чтобы увидеть влияние использования @XmlElement (nillable = true) .
package blog.json.nillable; import javax.xml.bind.*; public class Demo { public static void main(String[] args) throws Exception { Customer customer = new Customer(); customer.setFirstName("Jane"); customer.setMiddleName(null); customer.setLastName(null); JAXBContext jc = JAXBContext.newInstance(Customer.class); Marshaller marshaller = jc.createMarshaller(); marshaller.setProperty(Marshaller.JAXB_FORMATTED_OUTPUT, true); // Output XML marshaller.marshal(customer, System.out); // Output JSON marshaller.setProperty("eclipselink.media-type", "application/json"); marshaller.marshal(customer, System.out); } }
Вывод XML
По умолчанию реализации JAXB не включают в вывод значения NULL, поэтому нет элемента, соответствующего свойству middleName . Поскольку мы пометили свойство lastName как @XmlElement (nillable = true), и оно имело нулевое значение, оно представлено в выходных данных. В XML элемент с нулевым значением представлен добавлением атрибута xsi: nil = «true» .
<?xml version="1.0" encoding="UTF-8"?> <customer> <firstName>Jane</firstName> <lastName xsi:nil="true" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"/> </customer>
Вывод JSON
Как и в выводе XML, запись для свойства middleName не отображается в выводе JSON. Поскольку мы пометили свойство lastName как @XmlElement (nillable = true), и оно имело нулевое значение, оно представлено в выходных данных. В JSON значение NULL представлено значением NULL .
{ "customer" : { "firstName" : "Jane", "lastName" : null } }