writevalueasstring serialize parse deserialize java json serialization jackson

java - serialize - objectmapper writevalueasstring



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

Heredé un código de cierto bit que tiene la anotación @JsonProperty en getter / setters. El propósito es que cuando el objeto se serialice 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, también debo anotar el campo con JsonProperty. 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é a mi alrededor en la red pero no vi nada.

He compilado y ejecutado el código, pero no estoy seguro de si esto podría causar problemas en el futuro. Tiene alguna idea sobre esto?


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

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

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


Mis observaciones basadas en algunas pruebas han sido que cualquiera que sea el nombre que difiera del nombre de la propiedad es el que entra en vigencia:

Por ej. 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 un nombre de setFileName diferente1, 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, yendo a su caso, donde los tres @JsonProperty difieren del nombre de propiedad predeterminado de fileName , simplemente escogería uno de ellos como el atributo ( FILENAME ), y si hubiera alguno de los tres diferidos, habría arrojado una excepción :

java.lang.IllegalStateException: Conflicting property name definitions