【发布时间】:2015-12-11 05:23:33
【问题描述】:
常见的问题:我想以两种不同的方式序列化一个类。在一种情况下,我想包含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)
在这两种情况下,整个对象都被序列化了(就好像视图被忽略了一样)。为什么会这样?
我可以在网上找到的大多数文档、教程等都是针对较旧版本的 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,因为这意味着输出和不输出的静态配置。
使用:
- 杰克逊:2.6.1
- Java 7
- GAE SDK 1.9.30
- 对象化 5.1.7
【问题讨论】:
标签: java json serialization jackson