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

2020-06-23 12:01 来源:易采站长站 作者:丽君 点击: 评论:

A-A+

原标题:c# Newtonsoft 六个值得使用的特性(下)

一:讲故事

上一篇介绍的 6 个特性从园子里的反馈来看效果不错,那这一篇就再带来 6 个特性同大家一起欣赏。

二:特性分析

1. 像弱类型语言一样解析 json

大家都知道弱类型的语言有很多,如: nodejs,python,php,它们有一个🐮👃的地方就是处理json,不需要像 强类型语言 那样还要给它配一个类,什么意思呢? 就拿下面的 json 说事。

{
 "DisplayName": "新一代算法模型",
 "CustomerType": 1,
 "Report": {
 "TotalCustomerCount": 1000,
 "TotalTradeCount": 50
 },
 "CustomerIDHash": [1,2,3,4,5]
}

这个 json 如果想灌到 C# 中处理,你就得给它定义一个适配的类,就如 初篇 的客户算法模型类,所以这里就有了一个需求,能不能不定义类也可以自由解析上面这串 json 呢??? 哈哈,当然是可以的, 反序列化成 Dictionary 即可,就拿提取 Report.TotalCustomerCount CustomerIDHash 这两个字段演示一下。

  static void Main(string[] args)
  {
   var json = @"{
       'DisplayName': '新一代算法模型',
       'CustomerType': 1,
       'Report': {
        'TotalCustomerCount': 1000,
        'TotalTradeCount': 50
       },
       'CustomerIDHash': [1,2,3,4,5]
       }";

   var dict = JsonConvert.DeserializeObject<Dictionary<object, object>>(json);

   var report = dict["Report"] as JObject;
   var totalCustomerCount = report["TotalCustomerCount"];

   Console.WriteLine($"totalCustomerCount={totalCustomerCount}");

   var arr = dict["CustomerIDHash"] as JArray;
   var list = arr.Select(m => m.Value<int>()).ToList();

   Console.WriteLine($"list={string.Join(",", list)}");
  }

2. 如何让json中的枚举保持更易读的字符串型

这句话是什么意思呢? 默认情况下, SerializeObject 会将 Model 中的 Enum 变成数值型,大家都知道数值型语义性是非常差的,如下代码所示:

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

  var json = JsonConvert.SerializeObject(model);

  Console.WriteLine(json);
 }

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

对吧,确实语义特别差,那能不能直接生成 Running 这种字符串形式呢? 当然可以了。。。改造如下:

var json = JsonConvert.SerializeObject(model, new StringEnumConverter());

这里可能就有人钻牛角尖了,能不能部分指定让枚举生成 string,其他的生成 int ,没关系,这也难不倒我,哪里使用就用

【易采站长站编辑:秋军】