首页 > 解决方案 > JsonSerializationException:无法创建和填充列表类型

问题描述

我正在处理错误:

Newtonsoft.Json.JsonSerializationException:无法创建和填充列表类型 UpdatePurchaseOrders.SalesOrderSummaryCollection。路径'',第 1 行,位置 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"
    }
]

我有两个正在测试的课程。第一个是具有与 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; }
}

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

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

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

[...] 因为该类型需要 JSON 对象

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

标签: c#jsonjson.net

解决方案


您的 JSON 包含一个对象数组,因此可以使用以下命令对其进行解析:

var parsedArray = JArray.Parse(json);

您正在尝试反序列化为 type 的对象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);

推荐阅读