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

问题描述

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

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

我在这里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 类的 ErrorJsonSerializerSettings 属性。

相关问答

错误1:Request method ‘DELETE‘ not supported 错误还原:...
错误1:启动docker镜像时报错:Error response from daemon:...
错误1:private field ‘xxx‘ is never assigned 按Alt...
报错如下,通过源不能下载,最后警告pip需升级版本 Requirem...