Статьи

Привязка к JSON и XML — обработка пустых значений

В предыдущем посте я продемонстрировал, как EclipseLink MOXy можно использовать для создания представлений XML и JSON вашей доменной модели. Для обоих представлений используются одни и те же метаданные, и MOXy применяет их для использования возможностей типа носителя. В этом посте 
я сосредоточусь на том, как обрабатывается 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
   }
}