Сериализацията на Newtonsoft.Json на PagedList‹T› не включва някои свойства

Опитвам се да сериализирам обект 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);

Ако използвам горния код, в резултат получавам масив от продуктови обекти, сериализирани правилно. Свойствата по-долу (на 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.

Някой знае ли защо? И как мога да включа тези свойства в сериализацията?

Благодаря


person LeoD    schedule 03.06.2012    source източник


Отговори (4)


Сериализаторът вижда, че PagedList е изброим, така че го сериализира в JavaScript масив. За да направя това по-лесно за справяне, излагам функция GetMetaData() на обекта PagedList, която ще върне обект MetaData, съдържащ точно полетата, които споменахте по-горе. Това означава, че можете да сериализирате вашия pagedlist така:

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

Това трябва да доведе до JSON обект като този:

{
    "Items": [
        { ... },
        { ... },
        { ... }
    ],
    "MetaData": {
        "PageSize": 1,
        "PageCount": 2,
        "HasNextPage": true,
        ...
    }
}
person Troy    schedule 21.06.2012
comment
някаква идея как да се десериализира - person AMH; 11.05.2014
comment
Благодаря ти, Трой, много хубаво изпълнение. Просто добавям частта за десериализация, както поиска AMH. - person PedroSouki; 12.08.2016

има плъгин 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 съдържа пример

person turhanco    schedule 12.07.2013

За да сериализирате, просто използвайте имплементацията на 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)

и сте готови да тръгвате.

person PedroSouki    schedule 12.08.2016

По подразбиране asp.core използва DataContractSerializer, така че всеки може да зададе [DataContract] и [DataMember] на продуктов клас и членове и да получи необходимите данни със следното действие:

 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

person Lapenkov Vladimir    schedule 23.04.2019