2012-09-25 25 views
96

Este 'Estado' frijol:¿Cuándo se usa la propiedad @JsonProperty y para qué se utiliza?

public class State { 

    private boolean isSet; 

    @JsonProperty("isSet") 
    public boolean isSet() { 
     return isSet; 
    } 

    @JsonProperty("isSet") 
    public void setSet(boolean isSet) { 
     this.isSet = isSet; 
    } 

} 

se envía a través del cable utilizando el 'éxito' del ajax de devolución de llamada:

 success : function(response) { 
      if(response.State.isSet){ 
       alert('success called successfully) 
      } 

¿Está el @JsonProperty anotación requerida aquí? ¿Cuál es la ventaja de usarlo? Creo que puedo eliminar esta anotación sin causar ningún efecto secundario.

Leyendo sobre esta anotación en https://github.com/FasterXML/jackson-annotations/wiki/Jackson-Annotations ¿No sé cuándo es necesario utilizarla?

+0

wiki.fasterxml.com el enlace está roto – JohnK

Respuesta

126

He aquí un buen ejemplo. Lo uso para cambiar el nombre de la variable porque el JSON proviene de un entorno .Net donde las propiedades comienzan con una letra mayúscula.

public class Parameter { 
    @JsonProperty("Name") 
    public String name; 
    @JsonProperty("Value") 
    public String value; 
} 

Este análisis sintáctico correctamente a/desde el JSON:

"Parameter":{ 
    "Name":"Parameter-Name", 
    "Value":"Parameter-Value" 
} 
+0

¿Pueden las variables del miembro String no cambiarse de nombre a su caso correcto, por lo que el nombre String público; se convierte en un nombre de cadena pública; ? –

+7

Sí que pueden, pero en un entorno Java que hace que no coincidan con los estándares de codificación. Es más acerca de mi pedantería que un verdadero problema de codificación, pero es un ejemplo bueno pero simple de un uso real de la anotación '@ JsonProperty'. – OldCurmudgeon

+0

¿Se puede utilizar esta anotación para el miembro de tipo 'Doble'? Me pregunto si el tipo tiene que ser 'String' o cualquier tipo que soporte JSON? ¿Podría ser de algún tipo? @OldCurmudgeon – Dreamer

9

Sin anotaciones, nombre de la propiedad inferida (para que coincida de JSON) se "ajuste" y no - como parece ser el intento - "isSet". Esto se debe a que, según la especificación de Java Beans, los métodos de la forma "isXxx" y "setXxx" se toman como que significa que hay una propiedad lógica "xxx" para administrar.

24

Creo que OldCurmudgeon y StaxMan son correctos, pero aquí hay una respuesta de frase con un ejemplo simple para usted.

@JsonProperty (nombre), le dice a Jackson ObjectMapper que asigne el nombre de la propiedad JSON al nombre del campo anotado de Java.

//example of json that is submitted 
"Car":{ 
    "Type":"Ferrari", 
} 

//where it gets mapped 
public static class Car { 
    @JsonProperty("Type") 
    public String type; 
} 
+0

El nombre de la clase debe ser el mismo que el elemento raíz de JSON. Esto no funciona para mí – Pavan

20

bien para lo que su valor ahora ... JsonProperty también se utiliza para especificar los métodos get y set para la variable aparte de serialización y deserialización de costumbre. Por ejemplo supongamos que tiene una carga útil de esta manera:

{ 
    "check": true 
} 

y una clase deserializador:

public class Check { 

    @JsonProperty("check") // It is needed else Jackson will look got getCheck method and will fail 
    private Boolean check; 

    public Boolean isCheck() { 
    return check; 
    } 
} 

Luego, en este caso se neeeded JsonProperty anotación. Sin embargo, si usted también tiene un método en la clase

public class Check { 

    //@JsonProperty("check") Not needed anymore 
    private Boolean check; 

    public Boolean getCheck() { 
    return check; 
    } 
} 

un vistazo a esta documentación también: http://fasterxml.github.io/jackson-annotations/javadoc/2.3.0/com/fasterxml/jackson/annotation/JsonProperty.html

3

Como saben, esto es todo acerca de serialización y desalinizar un objeto. Supongamos que hay un objeto:

public class Parameter { 
    public String _name; 
    public String _value; 
} 

la serialización de este objeto es:

{ 
    "_name": "...", 
    "_value": "..." 
} 

El nombre de variable se utiliza directamente para serializar los datos. Si va a eliminar la API del sistema de la implementación del sistema, en algunos casos, debe cambiar el nombre de la variable en serialización/deserialización. @JsonProperty es un metadato para decirle al serializador cómo hacer un objeto en serie.Se utiliza para:

  • nombre de la variable
  • acceso (lectura, escritura)
  • valor predeterminado
  • requerido/opcional

de ejemplo:

public class Parameter { 
    @JsonProperty(
     value="Name", 
     required=true, 
     defaultValue="No name", 
     access= Access.READ_WRITE) 
    public String _name; 
    @JsonProperty(
     value="Value", 
     required=true, 
     defaultValue="Empty", 
     access= Access.READ_WRITE) 
    public String _value; 
} 
0

De JsonProperty javadoc,

Define el nombre de la propiedad lógica, es decir, el nombre del campo del objeto JSON que se usará para la propiedad. Si el valor está vacío, String (que es el valor predeterminado), intentará usar el nombre del campo anotado.

0

Como adición a otras respuestas, @JsonProperty anotación es realmente importante si se utiliza la anotación @JsonCreator en las clases que no tiene un constructor sin argumentos.

public class ClassToSerialize { 

    public enum MyEnum { 
     FIRST,SECOND,THIRD 
    } 

    public String stringValue = "ABCD"; 
    public MyEnum myEnum; 


    @JsonCreator 
    public ClassToSerialize(MyEnum myEnum) { 
     this.myEnum = myEnum; 
    } 

    public static void main(String[] args) throws IOException { 
     ObjectMapper mapper = new ObjectMapper(); 

     ClassToSerialize classToSerialize = new ClassToSerialize(MyEnum.FIRST); 
     String jsonString = mapper.writeValueAsString(classToSerialize); 
     System.out.println(jsonString); 
     ClassToSerialize deserialized = mapper.readValue(jsonString, ClassToSerialize.class); 
     System.out.println("StringValue: " + deserialized.stringValue); 
     System.out.println("MyEnum: " + deserialized.myEnum); 
    } 
} 

En este ejemplo, el único constructor se marca como @JsonCreator, por lo tanto, Jackson se utilice este constructor para crear la instancia. Pero la salida es como:

Serializado: { "stringValue": "ABCD", "MyEnum": "PRIMERO"}

Excepción en hilo "principal" com.fasterxml.jackson.databind .exc.InvalidFormatException: no Es capaz de formar instancia de com.avl.mbdtool.verificationmodule.exceptiondocument.ClassToSerialize $ MyEnum del valor de la cadena 'stringValue': el valor no es uno de los nombres de instancia de enumeración declaradas: [PRIMERA, SEGUNDA, TERCERA ]

Pero después de la adición de la @JsonProperty anotación en el constructor:

@JsonCreator 
public ClassToSerialize(@JsonProperty("myEnum") MyEnum myEnum) { 
    this.myEnum = myEnum; 
} 

La deserialización es exitosa:

Serializado: { "MyEnum": "primero", "stringValue":" ABCD "}

StringValue: ABCD

MyEnum: PRIMERA