You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

C#中如何将非数组结构的JSON文件数据加载到List<T>?

JSON反序列化为对象列表抛出序列化异常

需求

从JSON文件读取数据,初始化一个Card对象列表。

JSON内容

{
  "Card1": {
    "Name": "Kyiv",
    "price": 200,
    "taxes": 150
  },
  "Card2": {
    "Name": "Kamiyanske",
    "price": 150,
    "taxes": 100
  },
  "Card3": {
    "Name": "Rivne",
    "price": 150,
    "taxes": 100
  }
}

尝试的代码

List<Card> LoadJson()
{
    using (StreamReader r = new StreamReader("C:\\fileName.json"))
    {
        string json = r.ReadToEnd();
        var items = JsonConvert.DeserializeObject<List<Card>>(json);
        return items;
    }
}

var Cards = LoadJson();
Console.WriteLine(Cards[0].Name);

抛出的异常

Newtonsoft.Json.JsonSerializationException: 无法将当前JSON对象(例如{"name":"value"})反序列化为类型'System.Collections.Generic.List`1[WpfApp1.Card]',因为该类型需要JSON数组(例如[1,2,3])才能正确反序列化。要解决此错误,请将JSON修改为JSON数组(例如[1,2,3])。


解决方法

方案1:修改JSON为数组格式

如果允许修改JSON文件,直接将结构改为数组形式,原代码即可正常运行:

[
  {
    "Name": "Kyiv",
    "price": 200,
    "taxes": 150
  },
  {
    "Name": "Kamiyanske",
    "price": 150,
    "taxes": 100
  },
  {
    "Name": "Rivne",
    "price": 150,
    "taxes": 100
  }
]

方案2:修改C#代码适配现有JSON结构

如果不能修改JSON文件,先将JSON反序列化为字典,再提取值转为列表:

List<Card> LoadJson()
{
    using (StreamReader r = new StreamReader("C:\\fileName.json"))
    {
        string json = r.ReadToEnd();
        // 先反序列化为字典,键为Card1/Card2这类标识,值为Card对象
        var cardDict = JsonConvert.DeserializeObject<Dictionary<string, Card>>(json);
        // 提取字典中的所有Card对象,转为List<Card>
        return cardDict.Values.ToList();
    }
}

var Cards = LoadJson();
Console.WriteLine(Cards[0].Name);

注意:Card类的属性匹配

确保Card类的属性名称与JSON字段一致(注意大小写),如果C#属性使用大写命名规范,可通过JsonProperty特性映射:

public class Card
{
    public string Name { get; set; }
    [JsonProperty("price")]
    public int Price { get; set; }
    [JsonProperty("taxes")]
    public int Taxes { get; set; }
}

内容的提问来源于stack exchange,提问作者Etnim

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.12 06:40:43