使用Newtonsoft反序列化JSON时得到空值员工列表问题求助
问题分析与解决
你遇到的问题核心是JSON结构和你反序列化的目标类型不匹配,咱们一步步拆解清楚:
问题根源
先看你的JSON数据结构:
[ { "employees": [ { "firstName": "John", "lastName": "Doe" }, { "firstName": "Anna", "lastName": "Smith" }, { "firstName": "Peter", "lastName": "Jones " } ] } ]
它本质是一个外层数组,数组里只包含1个对象,这个对象有一个employees属性,真正的员工列表其实是这个employees属性对应的数组。
但你直接用JsonConvert.DeserializeObject<List<employee>>(json)反序列化时,Newtonsoft会尝试把外层数组的每个元素(也就是那个带employees的对象)转换成employee实例——可你的employee类根本没有employees这个属性,所以框架只能默认把firstName和lastName设为null;再加上外层数组只有1个元素,最终你的列表里就只会有这么一个空实例。
解决方案
有两种简单的解决方式,选哪种都可以:
方式一:创建根类匹配JSON结构
先定义一个和外层JSON结构对应的类,让序列化框架能正确映射:
public class RootObject { public List<employee> employees { get; set; } }
然后修改反序列化代码,先拿到根对象列表,再提取真正的员工数据:
IList<employee> employees = new List<employee>(); string json = default(string); using (StreamReader r = new StreamReader("Database.json")) { json = r.ReadToEnd(); } // 先反序列化成RootObject的列表 var rootList = JsonConvert.DeserializeObject<List<RootObject>>(json); // 取出第一个RootObject里的员工列表(你的JSON外层数组只有一个元素) employees = rootList.FirstOrDefault()?.employees ?? new List<employee>();
方式二:直接解析JSON节点提取员工列表
如果你不想额外定义类,可以直接用Newtonsoft的JSON节点API来精准提取数据:
IList<employee> employees = new List<employee>(); string json = default(string); using (StreamReader r = new StreamReader("Database.json")) { json = r.ReadToEnd(); } // 解析外层数组 var outerArray = JArray.Parse(json); // 取出数组里的第一个对象,再获取它的employees属性对应的数组 var employeesArray = outerArray.First()["employees"]; // 把这个数组反序列化成List<employee> employees = employeesArray.ToObject<List<employee>>();
额外小提示
C#里类名和属性名通常遵循帕斯卡命名法(首字母大写),建议把employee改成Employee,属性改成FirstName和LastName,这样代码风格更规范,也符合团队协作的惯例~
内容的提问来源于stack exchange,提问作者TommasoS
相关产品推荐
相关产品推荐

