2012-06-03 85 views
3

我試圖序列化PagedList對象(https://github.com/martijnboland/MvcPaging/blob/master/src/MvcPaging/PagedList.cs)到JSON,像這樣:Newtonsoft.Json序列不包括一些屬性

PagedList<Product> pagedList = new PagedList<Product>(products, (page - 1), pageSize); 
string json = Newtonsoft.Json.JsonConvert.SerializeObject(pagedList); 

如果我使用上面的代碼,在結果我獲取正確序列化的Product對象數組。然而下面(的PagedList)的特性不被包含在JSON結果:

public bool HasNextPage { get; } 
    public bool HasPreviousPage { get; } 
    public bool IsFirstPage { get; } 
    public bool IsLastPage { get; } 
    public int ItemEnd { get; } 
    public int ItemStart { get; } 
    public int PageCount { get; } 
    public int PageIndex { get; } 
    public int PageNumber { get; } 
    public int PageSize { get; } 
    public int TotalItemCount { get; } 

他們沒有被序列化,但他們是PagedList的一部分。

有誰知道爲什麼?我怎麼能在序列化中包含這些屬性?

由於

回答

8

串行器看到該PagedList是枚舉的,因此它將其序列爲JavaScript陣列。爲了更容易處理,我在PagedList對象上公開了一個GetMetaData()函數,該函數將返回一個包含上面提到的字段的MetaData對象。這意味着您可以系列化你pagedlist像這樣:

string json = Newtonsoft.Json.JsonConvert.SerializeObject(new{ 
    items = pagedList, 
    metaData = pagedList.GetMetaData() 
}); 

這將導致一個JSON對象,像這樣:

{ 
    "Items": [ 
     { ... }, 
     { ... }, 
     { ... } 
    ], 
    "MetaData": { 
     "PageSize": 1, 
     "PageCount": 2, 
     "HasNextPage": true, 
     ... 
    } 
} 
+0

任何想法如何反序列化 – AMH

+0

謝謝特洛伊,非常好的實現。 AMH問道,我只是添加了反序列化部分。 – PedroSouki

0

有一個jQuery插件,它是用來激動地做到這一點:

https://github.com/turhancoskun/pagify.mvc

<script type="text/javascript"> 
$(function() { 
    $('#users').pagify({ 
     dataUrl: '/User/UserLis', 
     callBack: function(){ 
      // Ajax remove preloader and some other callbacks 
     }, 
     beforeSend: function(){ 
      // Ajax show preloader and some other function before start 
     } 
    }); 
} 
</script> 

readme.md文件包含一個例子

0

要序列化,只需使用特洛伊的實現。但是,反序列化創建2個新的類別:

public class PaginationEntity<TEntity> where TEntity : class 
{ 
    public PaginationEntity() 
    { 
     Items = new List<TEntity>(); 
    } 
    public IEnumerable<TEntity> Items { get; set; } 
    public PaginationMetaData MetaData { get; set; } 
} 

public class PaginationMetaData 
{ 
    public int Count { get; set; } 
    public int FirstItemOnPage { get; set; } 
    public bool HasNextPage { get; set; } 
    public bool HasPreviousPage { get; set; } 
    public bool IsFirstPage { get; set; } 
    public bool IsLastPage { get; set; } 
    public int LastItemOnPage { get; set; } 
    public int PageCount { get; set; } 
    public int PageNumber { get; set; } 
    public int PageSize { get; set; } 
    public int TotalItemCount { get; set; } 
} 

和反序列化是這樣的:

PaginationEntity<TEntity> listPaginated = JsonConvert.DeserializeObject<PaginationEntity<TEntity>>(json) 

,你是好去。