¿Cuándo se utiliza la propiedad @JsonProperty y para qué se utiliza?


Este 'Estado' de frijol:

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 usando la devolución de llamada ajax 'success':

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

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

Leyendo sobre este anuncio en https://github.com/FasterXML/jackson-annotations/wiki/Jackson-Annotations No se cuando se requiere que esto sea usado ?

Author: Carsten, 2012-09-25

8 answers

Aquí hay un buen ejemplo. Lo uso para cambiar el nombre de la variable porque el JSON viene 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; 
}

Esto analiza correctamente a / desde el JSON:

"Parameter":{
  "Name":"Parameter-Name",
  "Value":"Parameter-Value"
}
 159
Author: OldCurmudgeon,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2017-08-25 14:59:11

Creo que OldCurmudgeon y StaxMan son ambos correctos, pero aquí hay una respuesta de oración 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 Java anotado.

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

//where it gets mapped 
public static class Car {
  @JsonProperty("Type")
  public String type;
 }
 28
Author: CPU 100,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2018-09-12 16:47:24

Bien por lo que vale ahora... JsonProperty TAMBIÉN se usa para especificar los métodos getter y setter para la variable, aparte de la serialización y deserialización habituales. Por ejemplo, supongamos que tiene una carga útil como esta:

{
  "check": true
}

Y una clase Deserializer:

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

Entonces en este caso se necesita la anotación JsonProperty. Sin embargo, si 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;
  }
}

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

 26
Author: Richeek,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2015-07-13 10:42:27

Sin anotaciones, el nombre de propiedad inferido (para coincidir con JSON) sería "set", y no not como parece ser la intención isS "isSet". Esto se debe a que según la especificación de Java Beans, los métodos de forma "isXXX" y "setXXX" se toman para significar que hay una propiedad lógica " xxx " para administrar.

 9
Author: StaxMan,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2012-09-26 02:53:18

Como usted sabe, todo esto se trata de serializar 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 la variable se usa directamente para serializar datos. Si está a punto de 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 meta datos para decirle a serializer cómo hacer un objeto serial. Se utiliza para:

  • variable nombre
  • acceso (LECTURA, ESCRITURA)
  • valor predeterminado
  • obligatorio / opcional

Del 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; 
}
 3
Author: مصطفی,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2017-07-01 12:59:49

Como adición a otras respuestas, la anotación @JsonProperty es realmente importante si usa la anotación @JsonCreator en clases que no tienen un constructor no-arg.

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 está marcado como @JsonCreator, por lo tanto Jackson usará este constructor para crear la instancia. Pero la salida es como:

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

Excepción en thread " lo más importante" com.fasterxml.jackson.databind.exc.InvalidFormatException: No puede construir instancia de com.avl.mbdtool.módulo de verificación.exceptiondocument.ClassToSerialize My MyEnum from String value 'stringValue': valor no uno de la enumeración declarada nombres de instancia: [PRIMERO, SEGUNDO, TERCERO]

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

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

La deserialización es exitosa:

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

StringValue: ABCD

MyEnum: PRIMERO

 2
Author: DVarga,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2018-02-08 18:31:39

Agregar el JsonProperty también garantiza la seguridad en caso de que alguien decida que desea cambiar uno de los nombres de propiedad sin darse cuenta de que la clase en cuestión se serializará a un objeto Json. Si cambian el nombre de la propiedad, JsonProperty garantiza que se utilizará en el objeto Json y no en el nombre de la propiedad.

 1
Author: arush436,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2018-04-25 10:14:20

De JsonProperty javadoc,

Define el nombre de la propiedad lógica, es decir, el nombre del campo de objeto JSON que se utilizará para la propiedad. Si el valor es una cadena vacía (que es la predeterminada), intentará usar el nombre del campo que está anotado.

 0
Author: sc30,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2017-11-08 15:50:12