web-dev-qa-db-fra.com

Vous voulez masquer certains champs d'un objet qui sont mappés sur JSON par Jackson

J'ai une classe utilisateur que je souhaite mapper sur JSON à l'aide de Jackson.

public class User {
    private String name;
    private int age;
    prviate int securityCode;

    // getters and setters
}

Je mappe cela à une chaîne JSON en utilisant -

User user = getUserFromDatabase();

ObjectMapper mapper = new ObjectMapper();   
String json =  mapper.writeValueAsString(user);

Je ne veux pas mapper la variable securityCode. Existe-t-il un moyen de configurer le mappeur pour qu'il ignore ce champ?

Je sais que je peux écrire des mappeurs de données personnalisés ou utiliser l'API Streaming mais je voudrais savoir s'il est possible de le faire via la configuration?

37
sonicboom

Vous avez deux options:

  1. Jackson travaille sur des poseurs-getters de champs. Ainsi, vous pouvez simplement supprimer le getter de champ que vous souhaitez omettre dans JSON. (Si vous n'avez pas besoin de getter à un autre endroit.)

  2. Ou, vous pouvez utiliser le @JsonIgnoreannotation de Jackson sur la méthode getter de ce champ et vous n'y voyez aucune paire clé-valeur dans le JSON résultant.

    @JsonIgnore
    public int getSecurityCode(){
       return securityCode;
    }
    
60
Ravi Khakhkhar

vous pouvez également rassembler toutes les propriétés d'une classe d'annotation

@JsonIgnoreProperties( { "applications" })
public MyClass ...

String applications;
12
Benjamin Fuentes

Ajouter ceci ici parce que quelqu'un d'autre pourra le chercher à nouveau à l'avenir, comme moi. Cette réponse est une extension de la Réponse acceptée

You have two options:

1. Jackson works on setters-getters of fields. So, you can just remove getter of field which you want to omit in JSON. ( If you don't need getter at other place.)

2. Or, you can use the `@JsonIgnore` [annotation of Jackson][1] on getter method of that field and you see there in no such key-value pair in resulted JSON. 

        @JsonIgnore
        public int getSecurityCode(){
           return securityCode;
        }

En fait, une version plus récente de Jackson a ajouté des arguments d'annotation READ_ONLY et WRITE_ONLY pour JsonProperty . Vous pouvez donc aussi faire quelque chose comme ça.

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

au lieu de

@JsonIgnore
public int getSecurityCode(){
  return securityCode;
}
10
so-random-dude

Si vous ne voulez pas mettre d'annotations sur vos Pojos, vous pouvez également utiliser Genson .

Voici comment vous pouvez exclure un champ avec lui sans aucune annotation (vous pouvez également utiliser des annotations si vous le souhaitez, mais vous avez le choix).

Genson genson = new Genson.Builder().exclude("securityCode", User.class).create();
// and then
String json = genson.serialize(user);
6
eugen

si vous utilisez GSON, vous devez marquer les déclarations de champ/membre comme @Expose et utiliser GsonBuilder (). excludeFieldsWithoutExposeAnnotation (). create ()

N'oubliez pas de marquer vos sous-classes avec @Expose sinon les champs ne s'afficheront pas.

1
tak

Niveau de champ:

public class User {
    private String name;
    private int age;
    @JsonIgnore
    private int securityCode;

    // getters and setters
}

Niveau de classe:

@JsonIgnoreProperties(value = { "securityCode" })
public class User {
    private String name;
    private int age;
    private int securityCode;
}
0
CamelTM

J'ai eu un cas similaire où j'avais besoin d'une propriété à désérialiser (JSON en objet) mais pas en série (objet en JSON)

Je suis d'abord allé pour @JsonIgnore - il a empêché la sérialisation des propriétés indésirables, mais n'a pas réussi à les désérialiser également. Essayer l'attribut value n'a pas aidé non plus car il nécessite une condition.

Enfin, travailler @JsonProperty avec l'attribut access fonctionnait comme un charme.

0
Puneet