web-dev-qa-db-fra.com

Ignorer un champ spécifique sur la sérialisation avec Jackson

J'utilise la bibliothèque Jackson.

Je veux ignorer un champ spécifique lors de la sérialisation/désérialisation, par exemple:

public static class Foo {
    public String foo = "a";
    public String bar = "b";

    @JsonIgnore
    public String foobar = "c";
}

Devrait me donner:

{
foo: "a",
bar: "b",
}

Mais j'obtiens:

{
foo: "a",
bar: "b",
foobar: "c"
}

Je sérialise l'objet avec ce code:

ObjectMapper mapper = new ObjectMapper();
String out = mapper.writeValueAsString(new Foo());

Le type réel du champ de ma classe est une instance de la classe Log4J Logger. Qu'est-ce que je fais mal?

56

Ok, alors pour une raison quelconque, j'ai raté cette réponse .

Le code suivant fonctionne comme prévu:

@JsonIgnoreProperties({"foobar"})
public static class Foo {
    public String foo = "a";
    public String bar = "b";

    public String foobar = "c";
}

//Test code
ObjectMapper mapper = new ObjectMapper();
Foo foo = new Foo();
foo.foobar = "foobar";
foo.foo = "Foo";
String out = mapper.writeValueAsString(foo);
Foo f = mapper.readValue(out, Foo.class);
86

À noter également que cette solution utilisant DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES: https://stackoverflow.com/a/18850479/1256179

1
rwblackburn

Référence de Comment puis-je dire à Jackson d'ignorer une propriété pour laquelle je n'ai aucun contrôle sur le code source?

Vous pouvez utiliser Jackson Mixins. Par exemple:

class YourClass {
  public int ignoreThis() { return 0; }    
}

Avec ce mixin

abstract class MixIn {
  @JsonIgnore abstract int ignoreThis(); // we don't need it!  
}

Avec ça:

objectMapper.addMixIn(YourClass.class, MixIn.class);
0
Tong