c# Newtonsoft 六个值得使用的特性(下)

2020-06-23 12:01:47丽君

未知字段报错
  static void Main(string[] args)
  {
   var json = "{'OrderTitle':'女装大佬', 'Created':'2020/6/23','Memo':'订单备注'}";

   var order = JsonConvert.DeserializeObject<Order>(json, new JsonSerializerSettings
   {
    MissingMemberHandling = MissingMemberHandling.Error
   });

   Console.WriteLine(order);
  }

  public class Order
  {
   public string OrderTitle { get; set; }
   public DateTime Created { get; set; }
   public override string ToString()
   {
    return $"OrderTitle={OrderTitle}, Created={Created}";
   }
  }

提取未知字段

我依稀的记得 WCF 在这种场景下也是使用一个 ExtenstionDataObject 来存储客户端传过来的未知字段,有可能是客户端的 model 已更新,server端还是旧版本,通常在 json 序列化中也会遇到这种情况,在 JsonConvert 中使用 _additionalData 就可以帮你搞定,在 OnDeserialized 这种AOP方法中进行拦截,如下代码:

 static void Main(string[] args)
 {
  var json = "{'OrderTitle':'女装大佬', 'Created':'2020/6/23','Memo':'订单备注'}";

  var order = JsonConvert.DeserializeObject<Order>(json);

  Console.WriteLine(order);
 }

 public class Order
 {
  public string OrderTitle { get; set; }

  public DateTime Created { get; set; }

  [JsonExtensionData]
  private IDictionary<string, JToken> _additionalData;

  public Order()
  {
   _additionalData = new Dictionary<string, JToken>();
  }

  [OnDeserialized]
  private void OnDeserialized(StreamingContext context)
  {
   var dict = _additionalData;
  }

  public override string ToString()
  {
   return $"OrderTitle={OrderTitle}, Created={Created}";
  }
 } 

6. 开启 JsonConvert 详细日志功能

有时候在查阅源码的时候开启日志功能更加有利于理解源码的内部运作,所以这也是一个非常实用的功能,看看如何配置吧。

  static void Main(string[] args)
  {
   var json = "{'OrderTitle':'女装大佬', 'Created':'2020/6/23','Memo':'订单备注'}";

   MemoryTraceWriter traceWriter = new MemoryTraceWriter();

   var account = JsonConvert.DeserializeObject<Order>(json, new JsonSerializerSettings
   {
    TraceWriter = traceWriter
   });

   Console.WriteLine(traceWriter.ToString());
  }

  public class Order
  {
   public string OrderTitle { get; set; }

   public DateTime Created { get; set; }

   public override string ToString()
   {
    return $"OrderTitle={OrderTitle}, Created={Created}";
   }
  }

三:总结

嘿嘿,这篇 6 个特性就算说完了, 结合上一篇一共 12 个特性,是不是非常简单且实用,后面准备给大家带来一些源码解读吧! 希望本篇对您有帮助,谢谢!