所有
我正在尝试将@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忽略我正在使用的实际类型而不是查看该字段的声明类型,我该怎么做?
感谢
答案 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