JsonIgnoreType只查看字段的声明类型?

时间:2017-03-17 18:50:41

标签: java json jackson

所有

我正在尝试将@JsonIgnoreType与Jackson 2.7.3一起使用。只要包含类型的字段声明与我分配给它的实际实例的类型相同,它似乎工作正常,但如果该字段被声明为超类型,则它不起作用。 / p>

例如,使用以下代码:

public class Sub extends Super {

  private String value = null;

  public Sub() {}

  public Sub(String value) {
    this.value = value;
  }

  public String getValue() {
    return value;
  }

  public void setValue(String value) {
    this.value = value;
  }
}

public class Foo {

  private Super value = null;

  public Foo() {}

  public Foo(Super value) {
    this.value = value;
  }

  public Super getValue() {
    return value;
  }

  public void setValue(Super value) {
    this.value = value;
  }
}

然后我尝试序列化这样的事情:

 new Foo(new Sub("123"));

无论我使用JsonIgnoreType注释还是mixin,输出都会像

一样
{"value":{"value":"123"}}

相反,我将类Foo中的变量声明更改为:

private Sub value = null;  // declared Sub instead of Super

然后我得到预期的输出:

{}

这似乎只是简单的愚蠢,就像多态不是一件事。对于我的用例,我不能忽略超类,因为它太宽泛了。我也不想关心Sub出现的位置。无论是在Foo,Bar,Baz还是其他任何地方,我都不想将它序列化。

如果让Jackson忽略我正在使用的实际类型而不是查看该字段的声明类型,我该怎么做?

感谢

1 个答案:

答案 0 :(得分:0)

据我所知,这可以正常工作。如果您指示Jackson忽略Sub类,则当它恰好被创建为Super的实例时,它没有理由忽略Sub类的对象。

您可以创建一个属性过滤条件,以便value Foo的实例有条件地忽略Sub class SubFilter extends SimpleBeanPropertyFilter { @Override public void serializeAsField(Object pojo, JsonGenerator jgen, SerializerProvider provider, PropertyWriter writer) throws Exception { if (!writer.getName().equals("value") || !(((Foo) pojo).getValue() instanceof Sub)) { writer.serializeAsField(pojo, jgen, provider); } } } 字段:

Foo

并记得注释@JsonFilter("subFilter") class Foo { (或使用mixin):

FilterProvider

并使用过滤器创建ObjectWriter,然后使用该过滤器创建Foo foo = new Foo(new Sub("123")); FilterProvider filters = new SimpleFilterProvider().addFilter("subFilter", new SubFilter()); String json = mapper.writer(filters).writeValueAsString(foo);

value

Super如果被创建为CREATE TABLE credit_cards ( credit_card_id int auto_increment primary key, customer VARCHAR(30), card_no CHAR(16), UNIQUE KEY (customer, card_no), FOREIGN KEY (customer) REFERENCES customers(username)); orders table: CREATE TABLE orders ( order_no INT AUTO_INCREMENT, customer VARCHAR(30) NOT NULL, date_time TIMESTAMP DEFAULT CURRENT_TIMESTAMP, credit_card_id int NOT NULL, PRIMARY KEY (order_no), FOREIGN KEY (customer) REFERENCES customers (username), FOREIGN KEY (credit_card_id) REFERENCES credit_cards (credit_card_id)); 或其他子类的实例,仍会被序列化。
您可以在this blog

中阅读更多内容