JsonSerializationException:无法创建和填充列表类型

JsonSerializationException: Cannot create and populate list type

我正在处理错误:

Newtonsoft.Json.JsonSerializationException: Cannot create and populate list type UpdatePurchaseOrders.SalesOrderSummaryCollection. Path '', line 1, position 1.

JSON:

[
    {
        "OrderNumber": "017323906",
        "PONumber": "PON023329",
        "DocType": "ZOR",
        "Status": "On Hold",
        "Total": 83899.1600,
        "DateEntered": "3/2/2021 11:05 AM",
        "LastChanged": "3/4/2021 7:19 AM"
    }
]

我正在测试两个 classes。第一个是属性匹配 JSON.

的对象
[JsonArray]
public class SalesOrderSummary
{
    public string OrderNumber { get; set; }
    public string PONumber { get; set; }
    public string DocType { get; set; }
    public string Status { get; set; }
    public float Total { get; set; }
    public string DateEntered { get; set; }
    public string LastChanged { get; set; }
}

我调用的第二个 collection 对象只有第一个对象的数组。

[JsonArray]
public class SalesOrderSummaryCollection 
{
    public SalesOrderSummary[] result { get; set; }
}

我去年在另一个项目中使用了这个确切的概念并且它工作得很好 - 没有使用任何 JSON 属性。
在这个当前项目中,我可以尝试反序列化为 class 并且我得到相同的错误。如果我使用 SalesOrderSummaryCollection 并删除 [JsonArray] 属性,则会收到以以下结尾的错误:

[...] because the type requires a JSON object

我犹豫地说我明白了,但我在 去年的项目 中没有收到这个错误。
所以我不知道为什么两个项目之间的相同概念表现不同或如何解决这个问题。

您 JSON 包含一个对象数组,因此它可以被解析为:

var parsedArray = JArray.Parse(json);

您正在尝试反序列化为 SalesOrderSummaryCollection 类型的对象,它定义了 SalesOrderSummary 个对象的数组。
JSON 不包含任何根对象,因此是异常。 要反序列化为该对象类型,您的 JSON 应以:

开头
{ "result": [ { // Object 1 }, { // Object N } ] }    

它不能用 [JsonArray] 修饰,因为它不是数组。

直接的解决方案是反序列化为 SalesOrderSummary 个对象的集合,List<SalesOrderSummary>SalesOrderSummary[]:

var salesOrder = JsonConvert.DeserializeObject<SalesOrderSummary[]>(json);
// or 
var salesOrder = JsonConvert.DeserializeObject<List<SalesOrderSummary>>(json);