2012-01-05 16 views
6

¿Cómo tengo JAXB para preservar los nulos cuando recibo un pinzamiento JSON que contiene un valor nulo o "".jersey JAX-RS JSON preserve null con anotaciones

de Cuerda: {"id":null,"fname":"John","region":""}

Object:

Person { 
    Integer id = 0 
    String fname = "John" 
    Region regions = 0 } 

me gustaría que vuelva nulo en lugar de 0

Esto es lo que tengo hasta ahora:

@Provider 
public class JAXBContextResolver implements ContextResolver<JAXBContext> { 
    private JAXBContext context; 
    private Class<?>[] types = {Person.class}; 

    public JAXBContextResolver() throws Exception { 
     this.context = new JSONJAXBContext(JSONConfiguration.natural().build(), types); 
    } 

    public JAXBContext getContext(Class<?> objectType) { 
     for (Class<?> c : types) { 
      if (c.equals(objectType)) { 
       return context; 
      } 
     } 
     return null; 
    } 
} 

Person.class está anotado con @XmlRootElement He intentado buscar en las anotaciones de Jackson, pero no han tenido éxito.

+0

Mismo problema aquí. Alguien tiene una solución para este problema. ObjectMapper parece ser ignorado por Jersey – keatch

+0

El mismo problema también. También traté de utilizar ObjectMapper y Jersey no pudo recogerlo también.No estoy seguro de que el uso de ObjectMapper sea la solución más simple de todos modos ... – Oleksi

+1

Mi problema similar se ha resuelto. Puedes ver si te ayuda ... http: //stackoverflow.com/questions/10420641/including-null-elements-in-json-output-of-jersey-restful-api-with-jaxb – Oleksi

Respuesta

3

Nota: Soy el líder EclipseLink JAXB (MOXy) y miembro del grupo de expertos JAXB (JSR-222).

A continuación se muestra un ejemplo de cómo esto se puede hacer con MOXy.

persona

moxy se deserializar el objeto Person como desee sin especificar los metadatos. Para que la salida JSON contenga valores nulos, puede usar la anotación @XmlElement(nillable=true) (consulte 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

Para especificar moxy como su proveedor de JAXB (JSR-222) es necesario agregar un archivo llamado jaxb.properties en el mismo paquete que sus clases de dominio con la siguiente entrada (véase Specifying EclipseLink MOXy as Your JAXB Provider).

javax.xml.bind.context.factory=org.eclipse.persistence.jaxb.JAXBContextFactory 

Demostración

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); 
    } 

} 

salida

{ 
    "id" : null, 
    "fname" : "John", 
    "regions" : null 
} 

Usando MOXY en una aplicación de JAX-RS

Para una n ejemplo del uso de MOXY en una aplicación JAX-RS ver:

0

Como de JSON-B JSR-367 (JAX-RS 2.1 JSR-370), la siguiente la anotación funciona en lugar de @XmlElement.

@JsonbProperty(nillable = true) 
Cuestiones relacionadas