在前后端使用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的源码,会带来很多惊喜的特性以及使用方式。
由简入繁,拿来即用
后续精彩,持续关注
联系客服