在前后端使用Json進行數(shù)據(jù)交互的時候,很多情況下我們定義的實體類與前端所需要的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的話,是如下數(shù)據(jù)
//Newtonsoft.Json.Formatting.Indented這個輸出的json數(shù)據(jù)是格式化之后的
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時間格式,輸出出來的并不是我們常用的格式,在不對類進行改變的情況下,我們可以使用下面的方式對時間數(shù)據(jù)進行格式化
//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特性,則使用序列化的時候,是沒有任何數(shù)據(jù)的,但如果對字段也添加了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的數(shù)據(jù)
//若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...
若上一篇和以上內容仍然未滿足某些開發(fā)需求,建議可以去看看Newtonsoft.Json的源碼,會帶來很多驚喜的特性以及使用方式。
由簡入繁,拿來即用
后續(xù)精彩,持續(xù)關注