Как десериализовать объект подкачки в C# .Net Core

У меня есть строка (хранящаяся в Redis), и мне нужно десериализовать ее в такой объект:

public class PagedList<T>
{
    public int TotalItems { get; }
    public int PageNumber { get; }
    public int PageSize { get; }
    public List<T> List { get; }

    //public PagedList() { }

    [JsonConstructor]
    public PagedList(IEnumerable<T> source, int totalRecord, int pageNumber, int pageSize)
    {
        TotalItems = totalRecord;
        PageNumber = pageNumber;
        PageSize = pageSize;
        List = source.ToList();
    }

    //[JsonConstructor]
    public PagedList(IQueryable<T> source, int totalRecord, int pageNumber, int pageSize)
    {
        TotalItems = totalRecord;
        PageNumber = pageNumber;
        PageSize = pageSize;
        List = source.ToList();
    }

    public int TotalPages => (int)Math.Ceiling(this.TotalItems / (double)this.PageSize);

    public PagingHeader GetHeader()
    {
        return new PagingHeader(this.TotalItems, this.PageNumber, this.PageSize, this.TotalPages);
    }
}

Строка:

{
  "TotalItems": 63,
  "PageNumber": 1,
  "PageSize": 2147483646,
  "List": [
    {
      "Id": 6,
      "Tendvhc": "Tỉnh Lào Cai",
      "Parentid": null,
      "Matinh": "10",
      "Mahuyen": "000",
      "Maxa": "00000",
      "Status": 1
    }
  ]
}

Я использую это в своем коде, но получаю ошибку:

JsonConvert.DeserializeObject<T>(jsonString)

Newtonsoft.Json.JsonSerializationException: не удалось найти конструктор для использования с типом GIS.CQRS.Queries.PagedList`1[iNRES.Service.Category.Domain.Models.Dvhc]. Класс должен иметь конструктор по умолчанию, один конструктор с аргументами или конструктор, отмеченный атрибутом JsonConstructor. Путь «TotalItems», строка 1, позиция 14. в Newtonsoft.Json.Serialization.JsonS

Как я могу работать со сложным объектом, как указано выше?


person vuongdingo    schedule 30.03.2021    source источник
comment
Я подозреваю, что если вы переименовали параметры, чтобы они соответствовали свойствам, которые они присваивают, это вполне может сработать. Вы не можете ожидать, что Json.NET будет просто знать, что параметр с именем source соответствует свойству с именем List.   -  person Jon Skeet    schedule 30.03.2021
comment
Вы можете использовать JsonPropertyAttribute name для изменения имени свойства при десериализации ref. Действительная строка Json должна быть хорошим дополнением, чтобы она была минимально воспроизводимым примером   -  person Drag and Drop    schedule 30.03.2021
comment
@JonSkeet Я только что попробовал этот код, но не сработал: [JsonConstructor] public PagedList(List<T> List, int TotalItems, int PageNumber, int PageSize) { this.TotalItems = TotalItems; this.PageNumber = PageNumber; this.PageSize = PageSize; this.List = List; }   -  person vuongdingo    schedule 30.03.2021
comment
Имена параметров конструктора должны быть в camelCase, а не в PascalCase.   -  person Jonas Høgh    schedule 30.03.2021
comment
@JonasHøgh Не сработало. [JsonConstructor] public PagedList(List<T> list, int totalItems, int pageNumber, int pageSize) { this.TotalItems = totalItems; this.PageNumber = pageNumber; this.PageSize = pageSize; this.List = list; }   -  person vuongdingo    schedule 30.03.2021
comment
не работает, не дает нам много информации. Точно такая же ошибка? Что-то немного другое?   -  person Jon Skeet    schedule 30.03.2021
comment
Я только что исправил проблему. @ДжонСкит   -  person vuongdingo    schedule 30.03.2021


Ответы (1)


Я только что исправил эту проблему:

с использованием

using JsonConstructorAttribute = Newtonsoft.Json.JsonConstructorAttribute;

вместо

using System.Text.Json.Serialization;

и добавление этого конструктора

[JsonConstructor]
public PagedList(List<T> list, int totalItems, int pageNumber, int pageSize)
{
    this.TotalItems = totalItems;
    this.PageNumber = pageNumber;
    this.PageSize = pageSize;
    this.List = list;
}

person vuongdingo    schedule 30.03.2021