Jackson: comment prévenir la sérialisation des champs

j'ai une classe d'entité avec un champ de mot de passe:

class User {
    private String password;

    //setter, getter..
}

je veux que ce champ soit sauté lors de la sérialisation. Mais il devrait quand même pouvoir se Desérialiser. C'est nécessaire, de sorte que le client peut m'envoyer un nouveau mot de passe, mais n'est pas capable de lire le cours.

Comment faire avec Jackson?

124
demandé sur skaffman 2012-02-02 17:10:41

8 réponses

, Vous pouvez le marquer comme @JsonIgnore .

Avec 1,9, vous pouvez ajouter @JsonIgnore pour getter, @JsonProperty pour setter, pour le rendre désérialiser mais pas sérialiser.

146
répondu Biju Kunjummen 2018-05-13 10:32:32

illustrant ce que StaxMan a déclaré, cela fonctionne pour moi

private String password;

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

@JsonProperty
public void setPassword(String password) {
    this.password = password;
}
90
répondu Gary 2018-03-17 00:27:30

la manière simple est d'annoter vos getters et setters.

Voici l'exemple original modifié pour exclure le mot de passe en texte clair, mais annoter ensuite une nouvelle méthode qui retourne simplement le champ Mot de passe en tant que texte crypté.

class User {
    private String password;

    public void setPassword(String password){...}
    @JsonIgnore
    public String getPassword(){...}

    @JsonProperty("password"}
    public String getEncryptedPassword(){...}
}
31
répondu Joe Allen 2013-02-21 15:48:03

mis à part @JsonIgnore , il y a quelques autres possibilités:

  • Utiliser JSON Vues pour filtrer les champs de façon conditionnelle (par défaut, ne sont pas utilisés pour la désérialisation; dans la version 2.0 sera disponible, mais vous pouvez utiliser de vue différents sur la sérialisation, la désérialisation)
  • @JsonIgnoreProperties sur la classe peut être utile
16
répondu StaxMan 2015-03-31 09:41:49

transient est la solution pour moi. merci! il est natif de Java et vous évite d'ajouter une autre annotation spécifique au framework.

6
répondu maxxyme 2013-02-13 17:37:50

à partir de Jackson 2.6 , une propriété peut être marquée comme lecture - ou écriture-seulement. C'est plus simple que de pirater les annotations sur les deux accesseurs et de garder toute l'information au même endroit:

public class User {
    @JsonProperty(access = JsonProperty.Access.WRITE_ONLY)
    private String password;
}
5
répondu Frank Pavageau 2018-03-16 12:58:00

on devrait se demander pourquoi vous voulez une méthode de getter publique pour le mot de passe. Hibernation, ou tout autre cadre ORM, fera avec une méthode privée getter. Pour vérifier si le mot de passe est correct, vous pouvez utiliser

public boolean checkPassword(String password){
  return this.password.equals(anyHashingMethod(password));
}
3
répondu Albert Waninge 2016-11-25 09:17:20

Jackson a une classe nommée SimpleBeanPropertyFilter qui aide à filtrer les champs pendant la sérialisation et la deserialisation; pas globalement. Je pense que c'est ce que tu voulais.

@JsonFilter("custom_serializer")
class User {
    private String password;

    //setter, getter..
}

puis dans votre code:

String[] fieldsToSkip = new String[] { "password" };

ObjectMapper mapper = new ObjectMapper();

final SimpleFilterProvider filter = new SimpleFilterProvider();
filter.addFilter("custom_serializer",
            SimpleBeanPropertyFilter.serializeAllExcept(fieldsToSkip));

mapper.setFilters(filter);

String jsonStr = mapper.writeValueAsString(currentUser);

cela empêchera le champ password d'être sérialisé. Vous pourrez aussi désérialiser les champs password comme il est. Assurez-vous juste qu'aucun filtre n'est appliqué sur L'objet ObjectMapper.

ObjectMapper mapper = new ObjectMapper();
User user = mapper.readValue(yourJsonStr, User.class);    // user object does have non-null password field
0
répondu hkr98 2018-04-07 09:26:22