使用JsonConvert.DeserializeObject,如何警告缺少成员,但继续反序列化?

Using JsonConvert.DeserializeObject, how to warn about missing members, but continue deserializing?

我正在使用 JsonConvert.DeserializeObject 反序列化一些对象。 json 文件中的属性可能不存在于相应的定义中。发生这种情况时,我想基本上忽略该字段并继续反序列化,但会在控制台中打印一条警告,指出该字段丢失。

DeserializeObject 的文档显示可以给出一个额外的 JsonSerializerSettings 参数,其中包含一个 MissingMemberHandling 设置。但是,可用于该设置的两个选项是 IgnoreError。前者默默地忽略缺失的字段并继续,后者停止反序列化并抛出错误。我似乎需要介于这两者之间的东西。

我在这里看到了类似的问题Detect if deserialized object is missing a field with the JsonConvert class in Json.NET。但是,在这道题中,原来的post是想让反序列化器抛出一个错误,停止反序列化。我希望它继续,但只是通知用户字段不匹配。有办法吗?

你可以这样做:

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 and Error properties of JsonSerializerSettings class.