Usar solo @JsonIgnore durante la serialización, pero no la deserialización

Resuelto chubbsondubs asked hace 11 años • 10 respuestas

Tengo un objeto de usuario que se envía hacia y desde el servidor. Cuando envío el objeto de usuario, no quiero enviar la contraseña hash al cliente. Entonces, agregué @JsonIgnorela propiedad de contraseña, pero esto también impide que se deserialice en la contraseña, lo que dificulta el registro de usuarios cuando no tienen una contraseña.

¿Cómo puedo @JsonIgnoreaplicar solo a la serialización y no a la deserialización? Estoy usando Spring JSONView, por lo que no tengo mucho control sobre el archivo ObjectMapper.

Cosas que he probado:

  1. Añadir @JsonIgnorea la propiedad
  2. Agregue @JsonIgnoresolo el método getter
chubbsondubs avatar Sep 20 '12 08:09 chubbsondubs
Aceptado

Exactamente cómo hacer esto depende de la versión de Jackson que estés usando. Esto cambió alrededor de la versión 1.9 ; antes de eso, podía hacer esto agregando @JsonIgnoreal captador.

Que has probado:

Agregue @JsonIgnore solo en el método getter

Haga esto y también agregue una @JsonPropertyanotación específica para el nombre de su campo JSON "contraseña" al método de configuración para la contraseña de su objeto.

Versiones más recientes de Jackson han agregado READ_ONLYargumentos WRITE_ONLYde anotación a favor JsonProperty. Entonces también podrías hacer algo como:

@JsonProperty(access = JsonProperty.Access.WRITE_ONLY)
private String password;

Los documentos se pueden encontrar aquí .

pb2q avatar Sep 20 '2012 01:09 pb2q

Para lograr esto, todo lo que necesitamos son dos anotaciones:

  1. @JsonIgnore
  2. @JsonProperty

Úselo @JsonIgnoreen el miembro de la clase, su captador y @JsonPropertysu definidor. Una ilustración de ejemplo ayudaría a hacer esto:

class User {

    // More fields here
    @JsonIgnore
    private String password;

    @JsonIgnore
    public String getPassword() {
        return password;
    }

    @JsonProperty
    public void setPassword(final String password) {
        this.password = password;
    }
}

Desde la versión 2.6: una forma más intuitiva es utilizar la com.fasterxml.jackson.annotation.JsonPropertyanotación en el campo:

@JsonProperty(access = Access.WRITE_ONLY)
private String myField;

Incluso si existe un captador, el valor del campo se excluye de la serialización.

JavaDoc dice:

/**
 * Access setting that means that the property may only be written (set)
 * for deserialization,
 * but will not be read (get) on serialization, that is, the value of the property
 * is not included in serialization.
 */
WRITE_ONLY

En caso de que lo necesites al revés, simplemente usa Access.READ_ONLY.

Daniel Beer avatar Dec 08 '2015 14:12 Daniel Beer

En mi caso, tengo a Jackson (des) serializando automáticamente los objetos que devuelvo desde un controlador Spring MVC (estoy usando @RestController con Spring 4.1.6). Tuve que usar com.fasterxml.jackson.annotation.JsonIgnoreen lugar de org.codehaus.jackson.annotate.JsonIgnore, de lo contrario, simplemente no hizo nada.

Alex Beardsley avatar Jun 22 '2015 15:06 Alex Beardsley

Otra forma sencilla de manejar esto es utilizar el argumento allowSetters = trueen la anotación. Esto permitirá que la contraseña se deserialice en su dto pero no la serializará en un cuerpo de respuesta que utilice un objeto contiene.

ejemplo:

@JsonIgnoreProperties(allowSetters = true, value = {"bar"})
class Pojo{
    String foo;
    String bar;
}

Ambos fooy barse completan en el objeto, pero solo foo se escribe en el cuerpo de una respuesta.

Dhandley avatar Dec 10 '2019 23:12 Dhandley