C# JsonSerializationException:无法反序列化当前JSON对象问题
问题根源
报错是实体结构、反序列化目标类型和JSON实际结构不匹配导致,另外你的JSON文件里写了单行注释,默认反序列化配置也会触发解析错误,具体不匹配点如下:
- 反序列化时直接指定目标类型为
List<Account>,但JSON根节点是普通对象,不是数组结构,无法直接转成列表 - 原Account类中把
users定义为字符串类型,但实际JSON里users是嵌套对象,该对象的键为动态的用户邮箱,对应值才是真正的账户字段信息 - JSON内容中包含
//Just bug here ill fix later这类单行注释,标准JSON规范不支持注释语法,默认配置下解析会直接失败
修复方案
1. 调整实体类定义
因为users节点下的用户标识是动态的邮箱字符串,没有固定字段名,用字典类型承接即可,正确的实体定义如下:
public class Root { // 键为用户邮箱,值为对应账户信息 public Dictionary<string, Account> users { get; set; } } public class Account { public string username { get; set; } public string type { get; set; } public string uuid { get; set; } public string sessionToken { get; set; } public string accessToken { get; set; } }
2. 修改反序列化逻辑
反序列化目标类型改为上面定义的Root类,同时增加注释忽略配置,兼容你现在JSON里写的注释内容,路径拼接建议用Path.Combine避免斜杠拼接错误:
using (StreamReader r = new StreamReader(Path.Combine(RandomUtils.launcherPath(), "users.json"))) { string json = r.ReadToEnd(); // 配置解析时忽略JSON中的注释 var jsonSettings = new JsonSerializerSettings { CommentHandling = CommentHandling.Ignore }; Root parseResult = JsonConvert.DeserializeObject<Root>(json, jsonSettings); // 需要拿到所有账户列表时,直接取字典的Value集合即可 List<Account> accountList = parseResult.users.Values.ToList(); }
提示:如果后续你把JSON里的单行注释删除,就可以不用传入自定义的JsonSerializerSettings配置,直接调用反序列化方法即可。用字典承接动态键的结构后,后续JSON里新增多少个用户账号,都可以正常解析,不需要额外修改实体类。
内容的提问来源于stack exchange,提问作者Raiskuy
相关产品推荐
相关产品推荐

