Примечание: Я EclipseLink JAXB (MOXy) и член JAXB (JSR-222) экспертная группа.
Ниже приведен пример того, как это можно сделать с помощью MOXy.
Человек
MOXy будет демонтировать объект Person
так, как вам нужно, без указания каких-либо метаданных. Чтобы выходной JSON содержал нулевые значения, вы можете использовать аннотацию @XmlElement(nillable=true)
(см. Привязка к JSON и XML - Обработка пустых значений ).
package forum8748537;
import javax.xml.bind.annotation.*;
@XmlAccessorType(XmlAccessType.FIELD)
public class Person {
@XmlElement(nillable=true)
Integer id;
@XmlElement(nillable=true)
String fname;
@XmlElement(nillable=true)
Region regions;
}
jaxb.properties
Чтобы указать MOXy в качестве вашего провайдера JAXB (JSR-222), вам нужно добавить файл с именем jaxb.properties
в тот же пакет, что и классы вашего домена, со следующей записью (см. Указание EclipseLink MOXy в качестве вашего провайдера JAXB ).
javax.xml.bind.context.factory=org.eclipse.persistence.jaxb.JAXBContextFactory
Демо
package forum8748537;
import java.io.StringReader;
import java.util.*;
import javax.xml.bind.*;
import javax.xml.transform.stream.StreamSource;
public class Demo {
public static void main(String[] args) throws Exception {
Map<String, Object> properties = new HashMap<String, Object>(2);
properties.put("eclipselink.media-type", "application/json");
properties.put("eclipselink.json.include-root", false);
JAXBContext jc = JAXBContext.newInstance(new Class[] {Person.class}, properties);
StringReader json = new StringReader("{\"id\":null,\"fname\":\"John\",\"region\":\"\"}");
Unmarshaller unmarshaller = jc.createUnmarshaller();
Person person = unmarshaller.unmarshal(new StreamSource(json), Person.class).getValue();
Marshaller marshaller = jc.createMarshaller();
marshaller.setProperty(Marshaller.JAXB_FORMATTED_OUTPUT, true);
marshaller.marshal(person, System.out);
}
}
выход
{
"id" : null,
"fname" : "John",
"regions" : null
}
Использование MOXy в приложении JAX-RS
Пример использования MOXy в приложении JAX-RS см.