web-dev-qa-db-ja.com

ジャクソンとのシリアル化の特定のフィールドを無視する

ジャクソンライブラリを使用しています。

シリアル化/逆シリアル化するときに特定のフィールドを無視したいので、たとえば:

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

    @JsonIgnore
    public String foobar = "c";
}

私に与える必要があります:

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

しかし、私は得ています:

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

このコードでオブジェクトをシリアル化しています:

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

私のクラスのフィールドの実際のタイプは、Log4J Loggerクラスのインスタンスです。何が間違っていますか?

56

わかりましたので、何らかの理由で私は この答え を逃しました。

次のコードは期待どおりに機能します。

@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

DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIESを使用したこのソリューションも注目に値します。 https://stackoverflow.com/a/18850479/1256179

1
rwblackburn

ソースコードを制御できないプロパティをジャックソンに無視させるにはどうすればよいですか?

Jackson Mixinsを使用できます。例えば:

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

このMixinで

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

これとともに:

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