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

使用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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.11 07:58:04