杰克逊,在序列化扩展集合的类时如何公开字段?

时间:2015-03-16 22:52:38

标签: jackson

我有一个用于分页结果的类,如下所示:

public class PaginatedList<T> extends LinkedList<T> {

    private int offset;
    private int count;
    private int totalResultCount;

    //...
}

我希望杰克逊像这样序列化它:

{
  "results":[1,2,3],
  "offset":0,
  "count":3,
  "totalResultCount":15
}

其中父列表包含三个整数值1,2和3。

在我的第一次尝试中,我发现Jackson实际上忽略了可分配给Collection类的类的任何属性。事后看来,这是有道理的,所以我现在正在寻找一种解决方法。搜索SO导致了两个类似的问题:

但是,这两个都导致了从继承切换到合成的建议。

我特意寻找允许课程扩展集合的解决方案。这个&#39; PaginatedList&#39; class是企业的通用核心的一部分,并扩展Collection,以便它可以作为整个代码中的集合使用(和内省)。改变成分不是一个选择。话虽这么说,我可以自由注释并以其他方式更改此类以支持序列化,如上所述。

所以,从我所知道的,我错过了两个部分(我在答案中寻找的内容):

  1. 如何让杰克逊看到&#39;添加的属性?
  2. 如何让杰克逊将收藏品的内容标记为&#39;结果&#39; JSON输出中的属性?
  3. PS:我只关注序列化。

1 个答案:

答案 0 :(得分:0)

Ashley Frieze在评论中指出了这一点,并且值得赞扬。

我通过创建一个JsonSerializer实例解决了这个问题,如下所示:

public class PaginatedListSerializer extends JsonSerializer<PaginatedList> {

    @Override
    public Class<PaginatedList> handledType() {
        return PaginatedList.class;
    }

    @Override
    public void serialize(PaginatedList value, JsonGenerator jgen, SerializerProvider provider) throws IOException, JsonProcessingException {
        jgen.writeStartObject();

        jgen.writeArrayFieldStart("results");
        for (Object entry : value) {
            jgen.writeObject(entry);
        }
        jgen.writeEndArray();
        jgen.writeNumberField("offset", value.offset);
        jgen.writeNumberField("count", value.count);
        jgen.writeNumberField("totalResultCount", value.totalResultCount);

        jgen.writeEndObject();
    }

}

当然,将其注册为模块:

SimpleModule testModule = new SimpleModule("PaginatedListSerializerModule", new Version(1, 0, 0, null, null, null));
testModule.addSerializer(new PaginatedListSerializer());
mapper.registerModule(testModule);