@ JsonProperty anotación en el campo, así como getter / setter


He heredado un cierto código de bits que tiene la anotación @JsonProperty en getter/setters. El propósito es que cuando el objeto sea serializado usando la biblioteca Jackson, los campos tengan ese nombre específico.

Código actual:

private String fileName;

@JsonProperty("FILENAME")
public String getFileName()
{
    return fileName;
}

@JsonProperty("FILENAME")
public void setFileName(String fileName)
{
    this.fileName = fileName;
}

Ahora para otra herramienta, necesito anotar el campo con JsonProperty también. Así que este será mi código cambiado:

@JsonProperty("FILENAME")
private String fileName;

@JsonProperty("FILENAME")
public String getFileName()
{
    return fileName;
}

@JsonProperty("FILENAME")
public void setFileName(String fileName)
{
    this.fileName = fileName;
}

¿Alguien ha usado esta misma anotación tanto en el campo como en el getter/setters? Miré alrededor la red, pero no vio nada.

He compilado y ejecutado el código, pero no estoy seguro de si esto causaría algún problema en el futuro. Alguna idea sobre esto?

Author: OceanBlue, 2012-07-17

2 answers

Mis observaciones basadas en algunas pruebas han sido que cualquier nombre que difiera del nombre de la propiedad es uno que tiene efecto:

Por ejemplo. considere una ligera modificación de su caso:

@JsonProperty("fileName")
private String fileName;

@JsonProperty("fileName")
public String getFileName()
{
    return fileName;
}

@JsonProperty("fileName1")
public void setFileName(String fileName)
{
    this.fileName = fileName;
}

Tanto el campo fileName como el método getFileName, tienen el nombre de propiedad correcto de fileName y setFileName tiene uno diferente fileName1, en este caso Jackson buscará un atributo fileName1 en json en el punto de deserialización y creará un atributo llamado fileName1 en el punto de serialización.

Ahora, llegando a su caso, donde todos los tres @JsonProperty difieren de la forma predeterminada propertyname de fileName, que acaba de elegir uno de ellos como el atributo(FILENAME), y había alguno de los tres difieren, se habría lanzado una excepción:

java.lang.IllegalStateException: Conflicting property name definitions
 42
Author: Biju Kunjummen,
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-07-17 18:45:37

Además de las buenas respuestas existentes, tenga en cuenta que Jackson 1.9 mejoró el manejo al agregar "unificación de propiedades", lo que significa que TODAS las anotaciones de las partes diferentes de una propiedad lógica se combinan, utilizando (con suerte) precedencia intuitiva.

En Jackson 1.8 y anteriores, solo se usaban anotaciones de campo y getter para determinar qué y cómo serializar (escribir JSON); y solo anotaciones y setter para deserializar (leer JSON). Esto a veces requiere la adición de " extra" anotaciones, como anotar tanto getter como setter.

Con Jackson 1.9 y superior, estas anotaciones adicionales NO son necesarias. Todavía es posible agregarlos; y si se usan nombres diferentes, se pueden crear propiedades "divididas" (serializar usando un nombre, deserializar usando otro): esto es ocasionalmente útil para cambiar el nombre.

 8
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-07-18 19:02:25