Note: I'm the EclipseLink JAXB (MOXy) lead and a member of the JAXB (JSR-222) expert group.
Below is an example of how this can be done with MOXy.
Person
MOXy will unmarshal the Person
object as you want without specifying any metadata. To have the output JSON contain null values, you can use the @XmlElement(nillable=true)
annotation (see Binding to JSON & XML - Handling Null).
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
To specify MOXy as your JAXB (JSR-222) provider you need to add a file called jaxb.properties
in the same package as your domain classes with the following entry (see Specifying EclipseLink MOXy as Your JAXB Provider).
javax.xml.bind.context.factory=org.eclipse.persistence.jaxb.JAXBContextFactory
Demo
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);
}
}
Output
{
"id" : null,
"fname" : "John",
"regions" : null
}
Using MOXy in a JAX-RS Application
For an example of using MOXy in a JAX-RS application see: