足够常见的问题:我想以两种不同的方式序列化的类。在一种情况下,我想要包含getItems()
方法的输出,而在另一种情况下,我不想在输出中看到这一点。
选择使用Jackson Views,因为它给了我最大的灵活性。创建:
public class Views {
public static class WithOrderItems {
}
}
然后在要序列化的类中:
@JsonView(Views.WithOrderItems.class)
public Iterable<OrderItem> getItems() {
//Code...
}
在进行序列化的方法中:
// Expectation: this *should not* include "items" in JSON output
mapper.writeValueAsString(retObj)
返回与:
相同// Expectation: this should include "items" in JSON output
mapper.writerWithView(Views.WithOrderItems.class).writeValueAsString(retObj)
在这两种情况下,整个对象都被序列化(就好像忽略了View一样)。为什么会这样?
我在网上找到的大部分文档,教程等都适用于旧版本的Jackson。我错过了一些设置吗?据我了解,使用视图注释的方法不应包含在默认mapper
中。
我的mapper
配置是:
public static ObjectMapper mapper = new ObjectMapper().registerModule(new GuavaModule())
.registerModule(MoneySerializer.getAsModule());
static {
mapper.setSerializationInclusion(Include.NON_ABSENT);
}
(getAsModule()
是临时代码。MoneySerializer
适用于Joda Money对象,在这种情况下不会被调用。)
想避免使用mixins,因为这意味着输出内容的静态配置和不是什么。
使用:
答案 0 :(得分:2)
所以要排除 "items"
(或更一般地说,分配了特殊视图的字段/方法),请使用:
mapper.writerWithView(Object.class)
和包含 "items"
(或更一般地说,分配了Views.WithOrderItems
视图的字段/方法),请使用:
mapper.writerWithView(Views.WithOrderItems.class)
仅使用普通mapper
(即,没有从ObjectWriter
获得的mapper.writerWithView(...)
)将包含所有内容。
答案 1 :(得分:1)
据我所知,使用视图注释的方法不应该是 包含在默认映射器中。
我不认为这是真的。如果您不提供任何视图,mapper应该序列化所有内容。
注意:即使您只想使用“默认”视图 - 也就是说,只排除仅包含在特定“完整”视图中的内容 - 您需要通过指定视图来启用视图处理。如果您没有明确的“基本”视图设置,只需使用Object.class。
取自here