【问题标题】:Newtonsoft.Json serialization of PagedList<T> is not including some propertiesPagedList<T> 的 Newtonsoft.Json 序列化不包括某些属性
【发布时间】:2012-06-07 21:29:20
【问题描述】:

我正在尝试将 PagedList 对象 (https://github.com/martijnboland/MvcPaging/blob/master/src/MvcPaging/PagedList.cs) 序列化为 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 的一部分。

有人知道为什么吗?我怎样才能在序列化中包含这些属性?

谢谢

【问题讨论】:

    标签: json json.net pagedlist


    【解决方案1】:

    序列化程序看到 PagedList 是可枚举的,因此将其序列化为 JavaScript 数组。为了使这更容易处理,我在 PagedList 对象上公开了一个 GetMetaData() 函数,该函数将返回一个 MetaData 对象,其中包含您上面提到的字段。这意味着您可以像这样序列化您的分页列表:

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

    这应该会产生一个像这样的 JSON 对象:

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

    【讨论】:

    • 知道如何反序列化
    • 谢谢特洛伊,非常好的实现。我只是按照 AMH 的要求添加了反序列化部分。
    【解决方案2】:

    有一个 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 文件包含一个示例

    【讨论】:

      【解决方案3】:

      要序列化,只需使用 Troy 的实现即可。但是要反序列化创建 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)
      

      你可以走了。

      【讨论】:

        【解决方案4】:

        默认情况下,asp.core 使用 DataContractSerializer,因此任何人都可以将 [DataContract][DataMember] 设置为 Product 类和成员,并通过以下操作获取所需的数据:

         public IActionResult Products(int page=1,int countPerPage=10)
            {
                var result = _dbContext.Products.AsNoTracking().ToPagedList(page, countPerPage);
        
                return Ok( new{result, total=result.TotalItemCount });
            }
        

        无需使用 Newtonsoft.Json

        【讨论】:

          猜你喜欢
          • 2020-03-24
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2023-03-29
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2023-03-09
          相关资源
          最近更新 更多