【发布时间】:2021-06-26 13:09:45
【问题描述】:
我有一个字符串(存储在 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
如何处理像上面这样的复杂对象?
【问题讨论】:
-
我怀疑如果您重命名参数以匹配它们分配的属性,它可能会正常工作。你不能指望 Json.NET 仅仅“知道”一个名为“source”的参数对应一个名为“List”的属性。
-
您可以使用
JsonPropertyAttribute name在反序列化ref处更改属性名称。一个有效的 Json 字符串应该是一个很好的添加,因为它是 minimal reproducible example -
@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; } -
构造函数参数名应该是camelCase,而不是PascalCase
标签: c# serialization redis json.net