打开APP
userphoto
未登录

开通VIP,畅享免费电子书等14项超值服

开通VIP
Json.net的高级用法

在前后端使用Json进行数据交互的时候,很多情况下我们定义的实体类与前端所需要的Json格式的字段或者值并不能保持一致,所以我们需要在尽量改动小的情况下以满足以上场景;

所以这篇写一下关于Json.net的一些小操作。

我们有以下实体类

private class Studet{    public string name { get; set; }    public int age { get; set; }    public string idCard { get; set; }    public DateTime birthday { get; set; }    public List<hobby> hobbys { get; set; }}private class hobby{    public int sort { get; set; }    public string desc { get; set; }}
//初始化赋值Studet student = new Studet();student.name = "张三";student.age = 20;student.idCard = "1234567890";student.birthday = new DateTime(2021, 1, 1);List<hobby> list = new List<hobby>();list.Add(new hobby { desc = "写字", sort = 1 });list.Add(new hobby { desc = "游泳", sort = 2 });student.hobbys = list;

 如果直接序列化成Json的话,是如下数据

//Newtonsoft.Json.Formatting.Indented这个输出的json数据是格式化之后的string json = JsonConvert.SerializeObject(student, Newtonsoft.Json.Formatting.Indented);Console.WriteLine(json);//输出{  "name": "张三",  "age": 20,  "idCard": "1234567890",  "birthday": "2021-01-01T00:00:00",  "hobbys": [    {      "sort": 1,      "desc": "写字"    },    {      "sort": 2,      "desc": "游泳"    }  ]}

显而易见,我们遇到了第一个问题,birthday时间格式,输出出来的并不是我们常用的格式,在不对类进行改变的情况下,我们可以使用下面的方式对时间数据进行格式化

//DateTimeFormat可以直接写要生成的时间格式IsoDateTimeConverter timeFormat = new IsoDateTimeConverter { DateTimeFormat = "yyyy-MM-dd" };string json = JsonConvert.SerializeObject(student, Newtonsoft.Json.Formatting.Indented, timeFormat);

再介绍下修饰类的两个特性:

//该类所有成员都不会被序列化,添加了JsonProperty特性的可以[JsonObject(MemberSerialization.OptIn)]private class Studet{}
//该类所有公有成员会被序列化[JsonObject(MemberSerialization.OptOut)]private class Studet{}

介绍一下用法:假如我们的Studet类添加了OptIn特性,则使用序列化的时候,是没有任何数据的,但如果对字段也添加了JsonProperty特性,则有此特性的是可以被序列化的;

如我们上面的类只想输出name和age的话

[JsonObject(MemberSerialization.OptIn)]private class Studet{    [JsonProperty]    public string name { get; set; }    [JsonProperty]    public int age { get; set; }    public string idCard { get; set; }    public DateTime birthday { get; set; }    public List<hobby> hobbys { get; set; }}string json = JsonConvert.SerializeObject(student, Newtonsoft.Json.Formatting.Indented);//输出{"name":"张三","age":20}

如果我们除了idcard都要输出的话

[JsonObject(MemberSerialization.OptOut)]//也可不写,默认此模式private class Studet{    public string name { get; set; }    public int age { get; set; }    [JsonIgnore]    public string idCard { get; set; }    public DateTime birthday { get; set; }    public List<hobby> hobbys { get; set; }}string json = JsonConvert.SerializeObject(student, Newtonsoft.Json.Formatting.Indented);//输出{"name":"张三","age":20,"birthday":"2021-01-01","hobbys":[{"sort":1,"desc":"写字"},{"sort":2,"desc":"游泳"}]}

还可以自定义输出的字段名称

//加上此特性后,输出的值为Name:张三[JsonProperty(PropertyName = "Name")]public string name { get; set; }

除此之外,我们还可以忽略值为Null的数据

//若name值为Null,则不会输出JsonSerializerSettings jsetting = new JsonSerializerSettings();jsetting.NullValueHandling = NullValueHandling.Ignore;string json = JsonConvert.SerializeObject(student, jsetting);
//也可以针对单个字段值为Null做处理[JsonProperty(NullValueHandling=NullValueHandling.Ignore)]public string name { get; set; }

End...

若上一篇和以上内容仍然未满足某些开发需求,建议可以去看看Newtonsoft.Json的源码,会带来很多惊喜的特性以及使用方式。

由简入繁,拿来即用

后续精彩,持续关注

本站仅提供存储服务,所有内容均由用户发布,如发现有害或侵权内容,请点击举报
打开APP,阅读全文并永久保存 查看更多类似文章
猜你喜欢
类似文章
【热】打开小程序,算一算2024你的财运
SpringMVC: @ResponseBody后台解析JSON返回前端时大写字母变小写的问题
mybatis自定义typeHandler映射对象为JSON
C#封装百度Web服务API处理包含(Geocoding API,坐标转换API)
jackson之TypeReference复杂泛型和首字母大写的json转换
Newtonsoft.Json高级用法
SpringBoot序列化与反序列化
更多类似文章 >>
生活服务
热点新闻
分享 收藏 导长图 关注 下载文章
绑定账号成功
后续可登录账号畅享VIP特权!
如果VIP功能使用有故障,
可点击这里联系客服!

联系客服