繁体   English   中英

同一类的不同JSON序列化

[英]Different JSON serialization for the same class

足够常见的问题:我想以两种不同的方式序列化的类。 在一种情况下,我想包括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,因为这意味着输出内容和非输出内容的静态配置。

使用:

  • 杰克逊:2.6.1
  • Java 7
  • GAE SDK 1.9.30
  • 客观化5.1.7

澄清和扩大@ghokun的回答......

因此,要排除 "items" (或更一般地说,分配了特殊视图的字段/方法),请使用:

mapper.writerWithView(Object.class)

包含 "items" (或更一般地说,包含分配给它们的Views.WithOrderItems视图的字段/方法),使用:

mapper.writerWithView(Views.WithOrderItems.class)

使用只是普通的mapper (即,没有ObjectWriter从获得mapper.writerWithView(...)将包括一切。

据我所知,使用视图注释的方法不应包含在默认映射器中。

我不认为这是真的。 如果您不提供任何视图,则映射器应序列化所有内容。

注意:即使您只想使用“默认”视图 - 也就是说,只排除仅包含在特定“完整”视图中的内容 - 您需要通过指定视图来启用视图处理。 如果您没有明确的“基本”视图设置,只需使用Object.class。

取自这里

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM