调用JsonConvert.DeserializeObject反序列化User类返回null该如何解决
问题原因及解决方案
核心问题1:User类定义错误
- 字段名拼写错误:
Verified属性对应的JsonProperty注解中属性名写错为verfied,JSON返回的实际字段名是verified,拼写不匹配导致字段无法映射。 - 字段类型不匹配:JSON中
verified字段是布尔值类型,你定义的Verified属性为string类型,类型不匹配会导致反序列化异常。
修正后的User类代码:
public class User { [JsonProperty(PropertyName ="id")] public string Id { get; set; } [JsonProperty(PropertyName = "username")] public string Username { get; set; } [JsonProperty(PropertyName = "email")] public string Email { get; set; } [JsonProperty(PropertyName = "discriminator")] public string Discriminator { get; set; } [JsonProperty(PropertyName ="phone")] public string Phone { get; set; } // 修正拼写和类型 [JsonProperty(PropertyName ="verified")] public bool Verified { get; set; } }
核心问题2:变量作用域与返回值问题
你在FetchAccountInformation方法中反序列化得到的user是方法内的局部变量,没有将结果返回给调用方。而Main方法中你手动new了一个空的User对象,没有接收反序列化的结果,自然输出为空。
修正步骤:
- 修改
FetchAccountInformation方法的返回值类型为Task<User>,反序列化成功后返回结果:
public async Task<User> FetchAccountInformation() { // 原有请求逻辑 if (responseHtml.IsSuccessStatusCode) { var json = await responseHtml.Content.ReadAsStringAsync(); // 不需要UserWrapper,JSON根对象直接对应User结构 return JsonConvert.DeserializeObject<User>(json); } return null; }
- 修正Main方法的调用逻辑,接收返回结果:
static async Task Main(string[] args) { Utilities utilities = new Utilities(); // 按实际情况实例化工具类 Models.User user = await utilities.FetchAccountInformation(); if(user != null) { Console.WriteLine(user.Username); } }
核心问题3:不必要的包装类
你参考的回答对应的场景是JSON根对象嵌套了一层User字段,而你拿到的JSON根对象本身就是User结构,使用UserWrapper反而会因为结构不匹配导致反序列化失败,直接删除包装类即可。
通用排查方法
如果修改后还有问题可以按以下步骤排查:
- 打印拿到的
json字符串,确认返回结构和预期一致,没有外层嵌套、格式错误等问题 - 反序列化时添加错误监听配置,输出具体的反序列化错误信息:
var settings = new JsonSerializerSettings { Error = (sender, args) => { Console.WriteLine(args.ErrorContext.Error.Message); args.ErrorContext.Handled = true; } }; User user= JsonConvert.DeserializeObject<User>(json, settings);
内容的提问来源于stack exchange,提问作者shikim0ri
相关产品推荐
相关产品推荐

