C#反序列化JSON字符串为对象时App冻结无报错如何排查
问题原因
- 核心原因是你定义的
Monster类字段类型与dnd5eapi返回的JSON结构不匹配:proficiencies、special_abilities、actions、legendary_actions等字段实际返回的是嵌套对象数组,而你错误声明为List<string>;speed、senses也不是基础object类型,是包含多个属性的自定义对象。Newtonsoft.Json在反序列化遇到无法匹配的类型时,如果没有配置错误处理策略,就会出现无响应、隐式吞掉异常的情况。 - 次要排查点:可先断点查看
apiResponse的实际内容,确认接口请求是否正常返回了合法JSON,排除404、权限错误等导致的返回内容不符合预期的问题。
解决方法
- 临时调试验证:先用
JObject.Parse替代强类型反序列化,确认除了类型问题外没有其他故障:
// 替换原DeserializeObject行测试 var jObj = JObject.Parse(apiResponse); // 可以正常输出name字段说明JSON本身没问题 Console.WriteLine(jObj.Value<string>("name"));
- 配置序列化错误处理,避免无响应,同时输出具体错误信息:
var serializeSettings = new JsonSerializerSettings { // 忽略类中不存在的JSON字段 MissingMemberHandling = MissingMemberHandling.Ignore, // 处理反序列化错误,避免卡死 Error = (sender, eventArgs) => { eventArgs.ErrorContext.Handled = true; // 输出具体错误字段和原因,方便排查 Debug.WriteLine($"反序列化错误:{eventArgs.ErrorContext.Error.Message},出错字段:{eventArgs.ErrorContext.Member}"); } }; var monster = JsonConvert.DeserializeObject<Monster>(apiResponse, serializeSettings);
- 修正
Monster类的字段类型:把原本是嵌套对象的List<string>字段改为对应的实体类,或者暂时改为List<JToken>/List<dynamic>兼容复杂结构,speed、senses字段也改为对应的强类型或者JObject类型。 - 额外优化:不要在方法内每次实例化
HttpClient,会导致端口占用过多,建议将HttpClient改为单例注入使用。
内容的提问来源于stack exchange,提问作者Timothy Sutton
相关产品推荐
相关产品推荐

