я сосредоточусь на том, как обрабатывается 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
}
}