小Q的博客

  • 首页
  • net编程
    • 产品和框架
    • 开发实例
    • 经验技巧
    • 开源组件
  • wp独立站
  • 自媒体
  • 日记本
  • 工具箱
每个程序员,都应该有一个自己的博客站
  1. 首页
  2. net编程
  3. 经验技巧
  4. 正文

Newtonsoft的高级玩法,让你的json字符串与众不同

2022年11月13日 444点热度 1人点赞 0条评论

json一经出现就得到多很多开发员的青睐,数据传输直接取代了之前的xml格式,不过也确实非常好用。关于json的常用操作,可以参考这篇文章。今天要分享的是Newtonsoft这个类库对Json的高级操作,不光好用而且很实用。

Newtonsoft组件

目录

  • 1、格式化json
  • 2、结构化json
  • 3、没被赋值的字段不传输
  • 4、属性名的命名规则可调整
  • 5、属性名可以调整
  • 6、多个Json合并到一个Model

1、格式化json

一般将Object转成Json字符串后,就是一个字符串。阅读体验很不好,其实Newtonsoft提供了格式化的功能,用下面这个代码再转,就能实现。看看2个json字符串的差别?后者是不是比前者更容易阅读的

实现代码

PersonModel model1 = new PersonModel()
{
    id = 1001,
    name = "super man",    
    ctime = DateTime.Now,
};

string json1 = JsonHelper.GetJsonByObject(model1);
string json2 = JsonConvert.SerializeObject(model1, Newtonsoft.Json.Formatting.Indented);

 

未格式化Json串

{"id":1001,"name":"super man","ctime":"2022-11-13 14:45:06","sex":null,"nation":null,"total_amount":0,"totalPrice":0.0}

 

格式化的Json串

{
  "id": 1001,
  "name": "super man",
  "ctime": "2022-11-13T14:45:06.8807721+08:00",
  "sex": null,
  "nation": null,
  "total_amount": 0,
  "totalPrice": 0.0
}

2、结构化json

这个功能不是Newtonsoft的,放这里也一并说了。虽然格式化后的json字符串已经非常容易阅读了,但总感觉差点什么。如果加上下面这个功能是不是就完美了?就是结构化json字符串,树型结构展示。我是用这个小工具做到的,直接可以下载

formatdata-结构化json

3、没被赋值的字段不传输

这个功能更加实用,WebAPI开发时,有的参数类会定义很多参数,但具体使用时却并没有全部赋值。那些没有被赋值的参数,其实是不用传的。Newtonsoft也提供了这个功能

先定义一个Model类

public class PersonModel
{
    public int id { get; set; }
    public string name { get; set; }
    public DateTime ctime { get; set; }


    public string sex { get; set; }
    public string nation { get; set; }

    [JsonProperty(PropertyName = "total_amount")]
    public int totalAmount { get; set; }
    public decimal totalPrice { get; set; }
}

实现代码

PersonModel model1 = new PersonModel()
{
    id = 1001,
    name = "super man",    
    ctime = DateTime.Now,
};
var json3 = JsonConvert.SerializeObject(model1, Formatting.Indented,
    new JsonSerializerSettings
    {
        DefaultValueHandling = DefaultValueHandling.Ignore
    });

结果,值为null并没有生成

{
  "id": 1001,
  "name": "super man",
  "ctime": "2022-11-13T14:45:06.8807721+08:00"
}

 

4、属性名的命名规则可调整

以属性名TotalAmount为例,js采用驼峰命名法totalAmount,mysql采用蛇形命名法total_amount,c#的属性一般是首字母大写(就是示例)。Newtonsoft可以做到返回给js的时候驼峰命名、返回给mysql的时候蛇形命名

var json41 = JsonConvert.SerializeObject(model1, Formatting.Indented,
    new JsonSerializerSettings
    {
        ContractResolver = new CamelCasePropertyNamesContractResolver()
    });

var json42 = JsonConvert.SerializeObject(model1, Formatting.Indented,
    new JsonSerializerSettings
    {
        ContractResolver = new DefaultContractResolver()
        {
            NamingStrategy = new SnakeCaseNamingStrategy()
        }
    });

实现的结果

{
  "id": 1001,
  "name": "super man",
  "ctime": "2022-11-13T14:45:06.8807721+08:00",
  "sex": null,
  "nation": null,
  "total_amount": 0,
  "totalPrice": 0.0
}


{
  "id": 1001,
  "name": "super man",
  "ctime": "2022-11-13T14:45:06.8807721+08:00",
  "sex": null,
  "nation": null,
  "total_amount": 0,
  "total_price": 0.0
}

 

5、属性名可以调整

以淘宝开放平台为例,全是这种。Model类里的属性名是TotalAmount,但生成json里的属性名,就换成了total_amount(Model类里直接定义成total_amount不香吗?)。只要我们按照第3点中TotalAmount的定义就行了,引入[JsonProperty(PropertyName = "xxx")]特性即可

淘宝的API

 

6、多个Json合并到一个Model

按照提供的代码发现并没有实现这个功能,不知道哪里出了问题?这个场景相当于多个Json字符串,全部反序列化到一个Model类。如果想实现也不难,反射+循环属性赋值,判断属性值是否为Null

string json51 = JsonHelper.GetJsonByObject(new PersonModel()
{
    id = 1111,
    totalAmount = 100,
    name = "name1",
});
string json52 = JsonHelper.GetJsonByObject(new PersonModel()
{
    id = 2222,
});

PersonModel p53 = new PersonModel();
JsonConvert.PopulateObject(json51, p53, new JsonSerializerSettings() { CheckAdditionalContent = false, });
JsonConvert.PopulateObject(json52, p53, new JsonSerializerSettings() { CheckAdditionalContent = false, });
string json53 = JsonHelper.GetJsonByObject(p53);

 

相关阅读

net中c#教程 Json字符串的常用操作

标签: c#教程 json教程 net教程 Newtonsoft组件
最后更新:2022年11月13日

小Q

80后中年不油腻大叔,喜欢编写代码、打羽毛球、做木制玩具。目前定居浙江杭州

打赏 点赞
< 上一篇
下一篇 >

文章评论

razz evil exclaim smile redface biggrin eek confused idea lol mad twisted rolleyes wink cool arrow neutral cry mrgreen drooling persevering
取消回复

COPYRIGHT © 2022 小Q的博客. ALL RIGHTS RESERVED.

Theme Kratos Made By Seaton Jiang

浙ICP备2022019157号-2