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
相关产品推荐
相关产品推荐

