假设我有两个简单的类
@JsonFilter("filter properties by name")
public class Foo
{
private Integer id;
private String name;
}
@JsonFilter("filter properties by name")
public class Bar
{
private Integer id;
private String name;
private Foo foo;
}
我想序列化 Bar
的实例其中foo
字段只有它的 id。这一切都应该在运行时完成。
我尝试使用过滤器来做到这一点
FilterProvider filter = new SimpleFilterProvider().addFilter(
"filter properties by name", SimpleBeanPropertyFilter
.serializeAllExcept(/*name of the field to exclude*/));
objectMapper.writer(filter).writeValuAsString(bar);
但是,这样做时,我必须手动排除父类的所有字段;另外,如果该字段之一与子类的字段同名,则它们都被排除。
在我的示例中,我无法排除字段 name
以这种方式,因为它也会影响该领域name
Bar
的类。
那么,我怎样才能以最简洁/优雅的方式解决呢? 是否有类似于上面代码的东西,可能使用点符号或类似的东西?
例如到目前为止,在我的示例过滤器中,我可以编写类似 [...].serializeAllExcept("name", "foo"));
的内容,但很高兴拥有 [...].serializeAllExcept("foo.name"));
或类似的。
最佳答案
您不需要任何过滤器。 Foo 和 Bar 类没有变化。
新的 MixInFoo 类:
public class MixInFoo {
@JsonProperty("mixinFooId")
private Integer id;
@JsonIgnore
private String name;
}
我更改了“id”属性名称只是为了说明您可以完全更改响应而无需修改原始 Foo 类。
ObjectMapper objectMapper = new ObjectMapper();
objectMapper.getSerializationConfig().addMixInAnnotations(Foo.class, MixInFoo.class);
objectMapper.getDeserializationConfig().addMixInAnnotations(Foo.class, MixInFoo.class);
String result = objectMapper.writeValueAsString(json);
您需要注册 MixIn 类,如图所示。
***** 基于过滤器的实现 **********
是的,您可以使用 Filter 来达到相同的结果。您需要将 @JsonFilter 添加到 Foo 类并将其命名为“FooFilter”。然后您可以添加仅适用于 Foo 类的 Filter:
@JsonFilter("FooFilter")
public class Foo {
private Integer id;
private String name;
}
public class Bar {
private Integer id;
private String name;
private Foo foo;
}
public static void main(String []args) throws IOException {
ObjectMapper objectMapper = new ObjectMapper();
String []fooIgnore = {"name"};
SimpleBeanPropertyFilter propertyFilter = SimpleBeanPropertyFilter.serializeAllExcept(fooIgnore);
FilterProvider filterProvider = new SimpleFilterProvider().addFilter("FooFilter", propertyFilter);
ObjectWriter objectWriter = objectMapper.writer(filterProvider);
String result = objectWriter.writeValueAsString(json);
System.out.println(result);
}
在该实现中,您不需要扩展和实现自定义 SimpleBeanProvider 即可将过滤器仅应用于 Foo 类。
关于java - Jackson - 有什么方法可以避免在运行时父实体的序列化吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27178461/