2012-03-16 20 views
28

¿Cuál es la forma equiv en la anotación Jackson json para las siguientes anotaciones jax-b?¿Cómo asignar nombres de campo JSON a diferentes nombres de campos de objetos?

Necesito producir json en vez de xml y necesito saber las anotaciones de jackson convencionales que se indican de forma equivalente en jax-b.

  1. cambie el nombre de un campo.
  2. use getters en lugar de campos.

Estas características son especialmente crucial si el nombre del elemento JSON/XML es una palabra reservada de Java como "new", "public", "static", etc.

Así que tenemos que nombrar la campos POJO como "_static_" "_public_" "_new_",,, etc, respectivamente,

pero el uso JAX-b anotación para cambiar el nombre de nuevo a "nuevo", "público", "estática", etc. en el elementos XML (y json) generados.

Cambiar el nombre de un campo

@XmlAccessorType(XmlAccessType.FIELD) 
public class Person{ 
    @XmlElement(required = true) 
    protected String name; 
    @XmlElement(required = true) 
    protected String address; 
    @XmlElement(name = "contractor") 
    protected boolean _restricted_ ; 
    @XmlElement(name = "new") 
    protected boolean _new_ ; 
} 

redirección a la utilización de propiedad de captador (creo que esto es lo que se hace en JAX-b)

@XmlAccessorType(XmlAccessType.PROPERTY) 
public class Person{ 
    protected String name; 
    protected String address; 
    protected boolean _restricted_ ; 
    protected boolean _new_ ; 

    @XmlElement(required = true) 
    protected String getName() {return name;} 
    @XmlElement(required = true) 
    protected String getAddress() {return address;} 
    @XmlElement(name = "contractor") 
    protected boolean getRestricted() {return _restricted_;} 
    @XmlElement(name = "new") 
    protected boolean getNew(){return _new_;} 
} 
+0

¿El '@XmlElement (name = "nueva")' no funcionar para usted? Acabo de probarlo en un servlet de Jersey (que usa Jackson) y funcionó bien. – Danny

+0

Estoy usando RestyGWT - Creo que la función no se encuentra en RestyGWT y, por lo tanto, necesito saber el equivalente de jackson antes de intentar/proponer enviar un parche. –

+0

Gracias @BlessedGeek por la pista. Se puede encontrar más información en http://wiki.fasterxml.com/AnnotationIntrospector A pesar de que el método en el enlace es un poco viejo, estoy usando este código para establecer la prioridad del serializador/deserializador. objectMapper.setAnnotationIntrospector ( nuevo AnnotationIntrospectorPair ( nuevo JacksonAnnotationIntrospector(), nuevo JaxbAnnotationIntrospector() ) ); – aheryan

Respuesta

69

Probablemente es un poco tarde, pero de todos modos ..

puede cambiar el nombre de una propiedad sólo añadir

@JsonProperty("contractor") 

y por defecto Jackson utilizar el getter y setter para serializar y deserializar.

Para obtener información más detallada: http://wiki.fasterxml.com/JacksonFAQ

+2

¿Puedo utilizar esta anotación ** @ JsonProperty ** en la clase Persona que ya ha sido anotada con ** @ XmlElement **?Traté de anular los valores de las propiedades como esta: '@JsonProperty (value =" json_Name ") @XmlElement (name =" name_provider ") public String getName() { return name; } ' pero de todos modos mi valor del nombre es ** nombre_proveedor **, no ** json_Name ** – Nikolas

+2

Sí, aunque si funciona depende de la precedencia de' AnnotationIntrospector incluido (propio de Jackson vs JAXB). Ambos serán detectados, pero uno registrado con mayor prioridad "gana". – StaxMan

+0

Gracias @StaxMan por la pista. He utilizado la codificación encontrada [aquí] (http://wiki.fasterxml.com/AnnotationIntrospector) para establecer la prioridad – aheryan

Cuestiones relacionadas