如何用JsonConvert.DeserializeObject处理反序列化错误并保留有效属性?
解决方案
方法一:通过JsonSerializerSettings捕获并忽略反序列化错误
Newtonsoft.Json支持配置JsonSerializerSettings的Error回调,以此处理反序列化过程中的类型不匹配等错误,跳过有问题的字段,保留其他正确属性的赋值结果。
具体实现步骤:
- 创建
JsonSerializerSettings实例,注册Error事件处理逻辑; - 在错误回调中标记
args.ErrorContext.Handled = true,告诉序列化器跳过当前错误字段,继续处理剩余属性; - 将配置好的settings传入
DeserializeObject方法。
示例代码:
var settings = new JsonSerializerSettings { Error = (sender, args) => { // 标记错误已处理,跳过当前字段 args.ErrorContext.Handled = true; // 可选:打印错误信息用于调试 Console.WriteLine($"反序列化错误:{args.ErrorContext.Error.Message}"); } }; // 示例JSON(age为字符串类型):{"name": "John Smith", "age": "30", "city": "New York"} var myDeserializedClass = JsonConvert.DeserializeObject<Root>(myJsonResponse, settings);
此时name和city会正常完成反序列化,age因类型不匹配失败后会保留值类型的默认值0。如果希望age在反序列化失败时为null,可以将Root类中的age改为可空类型:
public class Root { public string name { get; set; } public int? age { get; set; } // 改为可空int类型 public string city { get; set; } }
方法二:结合特性忽略未知字段(补充)
如果API可能返回未在Root类中定义的额外字段,可以给Root类添加[JsonObject(MemberSerialization.OptIn)]特性,同时给需要反序列化的属性标记[JsonProperty],这样序列化器会自动忽略未标记的未知字段,和方法一结合使用能进一步增强容错性:
[JsonObject(MemberSerialization.OptIn)] public class Root { [JsonProperty] public string name { get; set; } [JsonProperty] public int age { get; set; } [JsonProperty] public string city { get; set; } }
内容的提问来源于stack exchange,提问作者felipebubu
相关产品推荐
相关产品推荐

