json一经出现就得到多很多开发员的青睐,数据传输直接取代了之前的xml格式,不过也确实非常好用。关于json的常用操作,可以参考这篇文章。今天要分享的是Newtonsoft这个类库对Json的高级操作,不光好用而且很实用。
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字符串,树型结构展示。我是用这个小工具做到的,直接可以下载
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")]特性即可
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);
相关阅读
文章评论