Visual Studio粘贴JSON为类后,JsonSerializer反序列化元素为空求助
问题分析与解决
问题场景
API返回的JSON结构是一个直接包含用户对象的数组:
[ { "firstName": "Bill", "lastName": "Gates", "email": "bill.gates@microsoft.com" }, { "firstName": "Steve", "lastName": "Balmer", "email": "steve.balmer@microsoft.com" } ]
通过Visual Studio 2022的“Paste JSON as Classes”生成了如下类:
public class Rootobject { public Class1[] Property1 { get; set; } } public class Class1 { public string firstName { get; set; } public string lastName { get; set; } public string email { get; set; } }
执行测试代码后,得到的employees数组包含2个元素,但每个元素的属性全为null:
string sJSON = @"[{""firstName"":""Bill"",""lastName"":""Gates"",""email"":""bill.gates@microsoft.com""},{""firstName"":""Steve"",""lastName"":""Balmer"",""email"":""steve.balmer@microsoft.com""}]"; Rootobject[] employees = JsonSerializer.Deserialize<Rootobject[]>(sJSON);
错误原因
- 类结构与JSON不匹配:VS的“Paste JSON as Classes”工具误判了JSON结构,给原本是数组的外层多套了一层
Rootobject包装类,但实际返回的JSON本身就是一个Class1类型的数组,并不存在Property1这个层级。 - 反序列化类型错误:你尝试把JSON数组反序列化为
Rootobject[],但JSON里的每个元素是Class1对象,不是Rootobject,序列化工具无法匹配属性,导致每个Rootobject实例的Property1为null。
解决方法
方法一:调整类结构,去掉多余的Rootobject
直接使用Class1(建议重命名为更有意义的Employee)作为数组元素类型:
// 重命名Class1为Employee,提升可读性 public class Employee { public string firstName { get; set; } public string lastName { get; set; } public string email { get; set; } }
然后修改反序列化代码:
string sJSON = @"[{""firstName"":""Bill"",""lastName"":""Gates"",""email"":""bill.gates@microsoft.com""},{""firstName"":""Steve"",""lastName"":""Balmer"",""email"":""steve.balmer@microsoft.com""}]"; Employee[] employees = JsonSerializer.Deserialize<Employee[]>(sJSON);
方法二:如果保留原类结构,需修改JSON匹配(不推荐)
如果一定要使用生成的Rootobject类,那JSON结构应该是包含Property1字段的对象,而非直接数组,但这不符合当前API返回的结构,所以不推荐这种方式。
内容的提问来源于stack exchange,提问作者user3676641
相关产品推荐
相关产品推荐

