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 por cable utilizando la devolución de llamada de 'éxito' ajax
success : function(response) {
if(response.State.isSet){
alert('success called successfully)
}
¿Se requiere la anotación @JsonProperty 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 usar esto?
Respuestas:
Aquí hay un buen ejemplo. Lo uso para cambiar el nombre de la variable porque el JSON proviene de un
.Net
entorno donde las propiedades comienzan con una letra mayúscula.Esto analiza correctamente a / desde el JSON:
fuente
@JsonProperty
anotación.Double
? Me pregunto si el tipo tiene que serString
o cualquier tipo compatible con JSON. ¿Podría ser de cualquier tipo? @OldCurmudgeonCreo que OldCurmudgeon y StaxMan son correctos, pero aquí hay una respuesta de oración con un ejemplo simple para ti.
@JsonProperty (nombre), le dice a Jackson ObjectMapper que asigne el nombre de la propiedad JSON al nombre del campo Java anotado.
fuente
bien por lo que vale ahora ... JsonProperty TAMBIÉN se usa para especificar métodos getter y setter para la variable, aparte de la serialización y deserialización habituales. Por ejemplo, suponga que tiene una carga útil como esta:
y una clase Deserializer:
Entonces, en este caso, se necesita la anotación JsonProperty. Sin embargo, si también tienes un método en la clase
Eche un vistazo a esta documentación también: http://fasterxml.github.io/jackson-annotations/javadoc/2.3.0/com/fasterxml/jackson/annotation/JsonProperty.html
fuente
Sin anotaciones, el nombre de propiedad inferido (para que coincida con JSON) se "establecería" y no, como parece ser la intención, "isSet". Esto se debe a que, según la especificación de Java Beans, los métodos de forma "isXxx" y "setXxx" significan que hay una propiedad lógica "xxx" para administrar.
fuente
Como saben, se trata de serializar y desalinizar un objeto. Supongamos que hay un objeto:
La serialización de este objeto es:
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 metadato para indicarle al serializador cómo serializar un objeto. Es usado para:
de ejemplo:
fuente
Agregar 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á en un objeto Json. Si cambian el nombre de la propiedad, JsonProperty asegura que se utilizará en el objeto Json y no en el nombre de la propiedad.
fuente
Además de otras respuestas, la
@JsonProperty
anotación es realmente importante si usa la@JsonCreator
anotación en clases que no tienen un constructor sin argumentos.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:Pero después de la adición de la
@JsonProperty
anotación en el constructor:La deserialización es exitosa:
fuente
Además de todas las respuestas anteriores, no olvide la parte de la documentación que dice
Si tiene un
non-static
método en su clase que no es convencionalgetter or setter
, puede hacer que actúe como talgetter and setter
utilizando la anotación en él. Vea el ejemplo a continuación.Cuando el objeto anterior se serializa, la respuesta contendrá
getUsername()
getId()
getIdAndUsername
*Dado que el método
getIdAndUsername
comienza con,get
entonces se trata como un captador normal, por lo tanto, ¿por qué podría anotar tal@JsonIgnore
?Si ha notado
concatenateIdAndUsername
que no se devuelve y eso se debe a que su nombre no comienzaget
y si desea que el resultado de ese método se incluya en la respuesta, puede usarlo@JsonProperty("...")
y se trataría de la manera normalgetter/setter
como se menciona en la documentación resaltada anteriormente .fuente
De JsonProperty javadoc,
fuente