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

2020-06-23 12:01:47丽君
JsonConverter 标记哪里。。。

  static void Main(string[] args)
  {
   var model = new ThreadModel()
   {
    ThreadStateEnum = System.Threading.ThreadState.Running,
    TaskStatusEnum = TaskStatus.RanToCompletion
   };

   var json = JsonConvert.SerializeObject(model);

   Console.WriteLine(json);
  }

  class ThreadModel
  {
   public System.Threading.ThreadState ThreadStateEnum { get; set; }

   [JsonConverter(typeof(StringEnumConverter))]
   public TaskStatus TaskStatusEnum { get; set; }
  } 

3. 格式化 json 中的时间类型

在 model 转化成 json 的过程中,总少不了 时间类型,为了让时间类型 可读性更高,通常会 格式化为 YYYY年/MM月/dd日 ,那如何实现呢? 很简单撒,在 JsonConvert 中也是一个 枚举 帮你搞定。。。

  static void Main(string[] args)
  {
   var json = JsonConvert.SerializeObject(new Order()
   {
    OrderTitle = "女装大佬",
    Created = DateTime.Now
   }, new JsonSerializerSettings
   {
    DateFormatString = "yyyy年/MM月/dd日",
   });

   Console.WriteLine(json);
  }
  public class Order
  {
   public string OrderTitle { get; set; }
   public DateTime Created { get; set; }
  } 

对了,我记得很早的时候,C# 自带了一个 JavaScriptSerializer, 也是用来进行 model 转 json的,但是它会将 datetime 转成 时间戳,而不是时间字符串形式,如果你因为特殊原因想通过 JsonConvert 将时间生成时间戳的话,也是可以的, 用 DateFormatHandling.MicrosoftDateFormat 枚举指定一下即可,如下:

4. 对一些常用设置进行全局化

在之前所有演示的特性技巧中都是在 JsonConvert 上指定的,也就是说 100 个 JsonConvert 我就要指定 100 次,那有没有类似一次指定,整个进程通用呢? 这么强大的 Newtonsoft 早就支持啦, 就拿上面的 Order 举例:

  JsonConvert.DefaultSettings = () =>
  {
   var settings = new JsonSerializerSettings
   {
    Formatting = Formatting.Indented
   };
   return settings;
  };

  var order = new Order() { OrderTitle = "女装大佬", Created = DateTime.Now };

  var json1 = JsonConvert.SerializeObject(order);
  var json2 = JsonConvert.SerializeObject(order);

  Console.WriteLine(json1);
  Console.WriteLine(json2);

5. 如何保证 json 到 model 的严谨性 及提取 json 未知字段

有时候我们有这样的需求,一旦 json 中出现 model 未知的字段,有两种选择: 要么报错,要么提取出未知字段,在 Newtonsoft 中默认的情况是忽略,场景大家可以自己找哈。