gpt4 book ai didi

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

转载 作者:太空宇宙 更新时间:2023-11-04 11:40:20 25 4
gpt4 key购买 nike

全部,

我正在尝试将 @JsonIgnoreType 与 Jackson 2.7.3 一起使用。只要包含该类型的字段被声明为与我分配给它的实际实例具有相同的类型,它似乎就可以正常工作,但是如果该字段被声明为父类(super class)型,那么它就不起作用。

例如,使用以下代码:

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

然后我得到预期的输出:

{}

这看起来简直是愚蠢的,就像多态性不是一个东西一样。对于我的用例,我不能忽略父类(super class),因为它太宽泛了。我也不想关心 Sub 类型出现在哪里。无论是在 Foo、Bar、Baz 还是其他任何地方,我都不想序列化它。

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

谢谢

最佳答案

据我所知,这符合预期。如果您指示 Jackson 忽略 Sub 类,那么当 Super 类的对象恰好被创建为 Sub 的实例时,它没有理由也忽略该对象。

您可以创建一个属性过滤器,当 FooSub 的实例时,有条件地忽略它的 value 字段:

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(或使用mixin):

@JsonFilter("subFilter")
class Foo {

还使用过滤器创建 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 或另一个子类的实例创建的,它仍然会被序列化。
您可以在 this blog 中阅读更多内容

关于java - JsonIgnoreType 只查看字段声明的类型?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42865131/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com