【问题标题】:Different JSON serialization for the same class同一类的不同 JSON 序列化
【发布时间】: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


    【解决方案1】:

    澄清和扩展@gokun 的答案...

    所以要排除 "items"(或更一般地说,具有分配给它们的特殊视图的字段/方法),请使用:

    mapper.writerWithView(Object.class)
    

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

    mapper.writerWithView(Views.WithOrderItems.class)
    

    仅使用普通的mapper(即,不使用从mapper.writerWithView(...) 获得的ObjectWriter)将包含所有内容。

    【讨论】:

      【解决方案2】:

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

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

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

      取自here

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多