【问题标题】:Using JsonConvert.DeserializeObject, how to warn about missing members, but continue deserializing?使用 JsonConvert.DeserializeObject,如何警告缺少成员,但继续反序列化?
【发布时间】:2021-05-16 14:19:03
【问题描述】:

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

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

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

【问题讨论】:

    标签: c# json json.net jsonconvert


    【解决方案1】:

    你可以这样做:

    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}";
        }
      }
    }
    

    基本上您需要同时使用JsonSerializerSettings 类的MissingMemberHandlingError 属性。

    【讨论】:

    • 谢谢!这正是我所需要的!我很高兴有一个不需要其他软件包的解决方案。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-07-22
    • 2018-10-19
    • 1970-01-01
    • 1970-01-01
    • 2013-10-10
    • 1970-01-01
    • 2014-03-06
    相关资源
    最近更新 更多