使用Newtonsoft反序列化JSON后得到空属性员工列表的问题
嗨,我来帮你搞定这个Newtonsoft反序列化的问题!
问题出在哪?
核心原因就是你的JSON结构和你要反序列化的类型不匹配:
- 你提供的JSON最外层是一个数组,里面只有一个对象,这个对象的
employees属性才是真正的员工列表; - 但你直接把整个JSON反序列化成
List<employee>,Newtonsoft找不到对应employee类的结构,只能生成一个默认的空对象(所以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(); } // 先把JSON转成根对象的列表 var rootList = JsonConvert.DeserializeObject<List<RootObject>>(json); // 取出第一个根对象里的员工列表(你的JSON里只有一个根对象) employees = rootList.FirstOrDefault()?.employees ?? new List<employee>();
办法2:直接定位到员工数组(不用新增类)
如果不想额外加类,也可以用Newtonsoft的JObject/JArray直接解析,精准拿到employees数组:
IList<employee> employees = new List<employee>(); string json = default(string); using (StreamReader r = new StreamReader("Database.json")) { json = r.ReadToEnd(); } // 先把JSON解析成数组 var jsonArray = JArray.Parse(json); // 定位到第一个对象里的employees字段 var employeesJson = jsonArray[0]["employees"]; // 把这个字段转成员工列表 employees = employeesJson.ToObject<List<employee>>();
额外提个小建议
按照C#的命名规范,类名和属性名最好用帕斯卡命名法(比如Employee代替employee,FirstName代替firstName),要是想和JSON里的小驼峰字段匹配,加个[JsonProperty]特性就行:
public class Employee { [JsonProperty("firstName")] public string FirstName { get; set; } [JsonProperty("lastName")] public string LastName { get; set; } }
这样既符合规范,又能完美匹配JSON字段~
内容的提问来源于stack exchange,提问作者TommasoS
相关产品推荐
相关产品推荐

