杰克逊序列化通用集合

时间:2016-03-09 00:48:34

标签: json jackson resteasy jsonserializer

我想使用Jackson来序列化一个包含泛型集合类型的对象。 这是界面:

public interface PagingAdapter <Id extends Serializable, T extends Entity<Id>> extends Serializable {
    public List<T> getItem();
    public void setItem(List<T> items);
    public Boolean hasNextPage();
    public Integer getTotalPage();
    public Integer getPageSize();
    public void setPageSize(int pageSize);

    public Long getTotalItem();
    public void setTotalItem(Long totalItem);
    public void setCurrentPage(Integer currentPage);
    public Integer getCurrentPage();
    public Class<T> getEntityType();    
    public void setEntityType(Class<T> entityType);
}

这是实施:

public class PagingAdapterImpl<Id extends Serializable, T extends Entity<Id>> implements
    PagingAdapter<Id,T> {
    private static Integer DEFAULT_PAGE_SIZE = 20;
    private Class<T> entityType;    
    private List<T> items = null;
    private Integer pageSize = DEFAULT_PAGE_SIZE;
    private Integer currentPage = 0;
    private Long totalItem;

    public PagingAdapterImpl(List<T> items, int currentPage, int pageSize, long totalItem) {
        super();
        this.items = items;
        this.pageSize = pageSize;
        this.currentPage = currentPage;
        this.totalItem = totalItem;
    }

    public PagingAdapterImpl(){

    }

    @Override
    public Class<T> getEntityType() {
        return entityType;
    }

    @Override
    public void setEntityType(Class<T> entityType) {
        this.entityType = entityType;
    }

    @Override   
    public List<T> getItem() {
        return items;
    }

    @Override
    public void setItem(List<T> items) {
        this.items = items;
    }

    @Override
    public Boolean hasNextPage() {
        return false;
    }

    @Override
    public Integer getTotalPage() {
        int rs = (int) (getTotalItem() % getPageSize() == 0 ? getTotalItem()
                / getPageSize() : getTotalItem() / getPageSize() + 1);
        return 0;
    }

    @Override
    public Integer getPageSize() {

        return this.pageSize;
    }

    @Override
    public Long getTotalItem() {

        return this.totalItem;
    }

    @Override
    public void setTotalItem(Long totalItem) {
        this.totalItem = totalItem;
    }

    @Override
    public void setCurrentPage(Integer currentPage) {
        this.currentPage = currentPage;
    }

    @Override
    public Integer getCurrentPage() {
        return currentPage;
    }

    @Override
    public void setPageSize(int pageSize) {
        this.pageSize = pageSize;
    }
}

我在Jackson 1.9中使用RestEasy。这个对象的rest方法的输出现在返回如下:

{
  "status": 0,
  "data": {
    "entityType": null,
    "pageSize": 1,
    "currentPage": 1,
    "totalItem": 1,
    "item": [],
    "totalPage": 0
  }
}

&#34;项目&#34;属性无法序列化为JSON数组。我该如何解决这个问题?

public class PagingAdapterSerializer extends JsonSerializer<PagingAdapter<Long, Entity<Long>>> {

@Override
public void serialize(PagingAdapter<Long, Entity<Long>> value, JsonGenerator jgen, SerializerProvider provider)
        throws IOException, JsonProcessingException {
    jgen.writeStartObject();
    jgen.writeObjectField("item",value.getItem());
    jgen.writeObjectField("totalItem",value.getTotalPage());
    jgen.writeObjectField("pageSize",value.getPageSize());
    jgen.writeObjectField("totalItem",value.getTotalItem());
    jgen.writeObjectField("currentPage",value.getCurrentPage());        
    jgen.writeEndObject();
}

这是我的自定义序列化程序。但它不起作用

1 个答案:

答案 0 :(得分:0)

除了将每个对象写入JsonGenerator之外,您还可以在代码下面为已定义的对象序列化它。

String toJson(Object object){
    JSONSerializer ser = new JSONSerializer().transform(new ExcludeNullTransformer(), void.class);
    ser.exclude("*.class");
    return ser.serialize(object);
}

在您的代码中包含最新jackson的依赖项。