我有一个用于分页结果的类,如下所示:
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,以便它可以作为整个代码中的集合使用(和内省)。改变成分不是一个选择。话虽这么说,我可以自由注释并以其他方式更改此类以支持序列化,如上所述。
所以,从我所知道的,我错过了两个部分(我在答案中寻找的内容):
( PS:我只关注序列化。)
答案 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);