如何正确实现JsonConvert错误处理?配置反序列化多余属性触发报错
JsonConvert 错误处理实现与额外属性检测配置详解
我来帮你梳理一下JsonConvert错误处理的正确姿势,以及你配置额外属性检测的相关问题:
一、正确实现JsonConvert的错误处理
Json.NET(Newtonsoft.Json)提供了多种灵活的错误处理方式,你可以根据业务场景选择合适的方案:
1. 捕获细分异常类型
在调用序列化/反序列化方法时,通过try-catch捕获Json.NET抛出的特定异常,能精准区分不同类型的错误:
try { // 反序列化示例 var targetObj = JsonConvert.DeserializeObject<YourTargetClass>(jsonContent); // 序列化示例 // var jsonStr = JsonConvert.SerializeObject(yourObject); } catch (JsonReaderException ex) { // 处理JSON格式本身的语法错误(比如括号不匹配、逗号遗漏等) Console.WriteLine($"JSON格式无效: {ex.Message}"); } catch (JsonSerializationException ex) { // 处理序列化/反序列化的逻辑错误(比如属性不匹配、类型转换失败、额外属性触发错误等) Console.WriteLine($"序列化逻辑错误: {ex.Message}"); } catch (JsonException ex) { // 所有JSON相关异常的兜底捕获 Console.WriteLine($"JSON处理失败: {ex.Message}"); }
2. 自定义错误回调(全局/局部)
如果你需要在错误发生时记录详情、选择性忽略错误(而非直接终止流程),可以通过JsonSerializerSettings的Error事件注册回调:
var serializerSettings = new JsonSerializerSettings { Formatting = Formatting.Indented, ReferenceLoopHandling = ReferenceLoopHandling.Ignore, TypeNameHandling = TypeNameHandling.Auto, MissingMemberHandling = MissingMemberHandling.Error, // 注册错误处理回调 Error = (sender, args) => { // 打印错误详情:包括错误路径、具体信息 Console.WriteLine($"错误发生在路径 [{args.ErrorContext.Path}]: {args.ErrorContext.Error.Message}"); // 如果不想让错误终止序列化/反序列化流程,设置Handled为true // args.ErrorContext.Handled = true; } }; // 全局配置的话,直接放到你的Global.asax.cs的Application_Start里即可 JsonConvert.DefaultSettings = () => serializerSettings;
二、反序列化时检测额外属性并返回错误的配置验证
你在Global.asax.cs里设置的MissingMemberHandling = MissingMemberHandling.Error是完全正确的,这个配置的核心作用就是:当JSON中存在C#目标类未定义的属性时,反序列化过程会主动抛出JsonSerializationException。
验证示例
假设你的目标类是:
public class UserInfo { public int UserId { get; set; } public string UserName { get; set; } }
如果传入的JSON包含额外属性:
{ "UserId": 1001, "UserName": "Alice", "Age": 25 // 这个属性在UserInfo类中未定义 }
当你执行反序列化时:
var json = "{\"UserId\":1001,\"UserName\":\"Alice\",\"Age\":25}"; try { var user = JsonConvert.DeserializeObject<UserInfo>(json); } catch (JsonSerializationException ex) { // 这里会捕获到错误:"Could not find member 'Age' on object of type 'UserInfo'." Console.WriteLine(ex.Message); }
注意事项
- 如果你的类标记了
[JsonObject(MemberSerialization.OptIn)]特性,只有带[JsonProperty]标记的属性会被处理,未标记的属性默认会被忽略,此时MissingMemberHandling.Error不会生效,需要确保类没有这个特性,或者显式标记所有需要处理的属性。 - 若使用了
TypeNameHandling,要注意类型解析的安全性,但这不会影响额外属性的检测逻辑。
内容的提问来源于stack exchange,提问作者user9393635
相关产品推荐
相关产品推荐

