【问题标题】:JsonSerializationException: Cannot create and populate list typeJsonSerializationException:无法创建和填充列表类型
【发布时间】:2021-03-06 00:28:34
【问题描述】:

我正在处理错误:

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; }
}

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

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

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

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

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

【问题讨论】:

  • 我不知道你为什么在 SalesOrderSummary 类上有 [JsonArray] 属性。你的 JSON 不是一个对象,它是一个集合。将其反序列化为SalesOrderSummary[]List<SalesOrderSummary>SalesOrderSummaryCollection 可能会妨碍您

标签: c# json json.net


【解决方案1】:

你的 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);

【讨论】:

    猜你喜欢
    • 2021-12-19
    • 2019-09-30
    • 1970-01-01
    • 2016-08-23
    • 1970-01-01
    • 1970-01-01
    • 2017-03-27
    • 2017-10-31
    • 1970-01-01
    相关资源
    最近更新 更多