2016-03-09 110 views
0

我想使用杰克逊序列化一个对象包括一个通用的集合类型。 这是接口:杰克逊序列化通用集合

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; 
    } 
} 

我使用RestEasy的杰克逊1.9。此对象的休息方法返回实例的输出如下所示:

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

“item”属性无法序列化为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(); 
} 

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

+0

你的对象没有问题,你可以分享你如何调用杰克逊 – Bhavesh

+0

我使用自定义杰克逊串行器,但很难指定泛型集合的实现类。它可以是任何实体类型。我想这就是为什么杰克逊不能序列化 – David

回答

0

除了将每个对象写入JsonGenerator,您可以在下面的代码中将其序列化为一个定义的对象。

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

在代码中包含最新杰克逊的依赖关系。

+0

但是我可以在哪里放置这个函数让RestEasy自动序列化我的对象? – David

+0

使用此方法序列化您的对象而不是使用您的方法 – Bhavesh

+0

谢谢。我修好了它。我的对象已经与杰克逊序列化,只是我的错误页面大小和当前页面的价值 – David