问题描述
我正在使用 JsonConvert.DeserializeObject
反序列化一些对象。 json 文件中的属性可能不存在于相应的定义中。发生这种情况时,我想基本上忽略该字段并继续反序列化,但在控制台中显示该字段丢失的警告。
DeserializeObject
的文档显示可以提供额外的 JsonSerializerSettings
参数,并且包含 MissingMemberHandling 设置。但是,可用于该设置的两个选项是 Ignore
和 Error
。前者默默地忽略缺失的字段并继续,后者停止反序列化并抛出错误。我似乎需要介于这两者之间的东西。
我在这里Detect if deserialized object is missing a field with the JsonConvert class in Json.NET看到了类似的问题。但是,在这个问题中,原始帖子希望反序列化器抛出错误并停止反序列化。我希望它继续,但只是通知用户字段不匹配。有没有办法做到这一点?
解决方法
你可以这样做:
using Newtonsoft.Json;
using Newtonsoft.Json.Serialization;
using System;
namespace NewtonsoftJsonSample
{
public static class Program
{
public static void Main(string[] args)
{
var json = "{'name': 'john','age': 45,'city': 'Bristol'}".Replace("'","\"");
// remember to set an error handler and to raise an error each time a member is missing
// during deserialization
var settings = new JsonSerializerSettings
{
Error = OnError,MissingMemberHandling = MissingMemberHandling.Error
};
var deserialized = JsonConvert.DeserializeObject<Character>(json,settings);
Console.WriteLine("Deserialized object: {0}",deserialized);
Console.ReadLine();
static void OnError(object sender,ErrorEventArgs args)
{
Console.WriteLine("Unable to find member '{0}' on object of type {1}",args.ErrorContext.Member,args.ErrorContext.OriginalObject.GetType().Name);
// set the current error as handled
args.ErrorContext.Handled = true;
}
}
}
public class Character
{
public string Name { get; set; }
public override string ToString()
{
return $"Name: {this.Name}";
}
}
}
基本上,您需要同时使用 MissingMemberHandling
类的 Error
和 JsonSerializerSettings
属性。