JsonSerializerSettings常用配置整理
1.忽略某些屬性
2.默認值的處理
3.空值的處理
4.支持非公共成員
5.日期處理(DateFormatHandling)
6.自定義序列化的字段名稱
7.動態決定屬性是否序列化
8.枚舉值的自定義格式化問題
9.自定義類型轉換
10.全局序列化設置
11.指定序列化時Key的處理方式:駝峯樣式,默認樣式(ContractResolver)
12.序列化循環 引用及處理層數
特別 說明:Newtonsoft.Json不依賴.Net Framework,是基於 .Net Standard封裝的,僅支持.Net Framework也支持.Net Core
官網地址:http://www.newtonsoft.com/json,Nuget 地址:https://www.nuget.org/packages/Newtonsoft.Json
一 、忽略某些屬性
類似本問開頭介紹的接口優化,實體中有些屬性不需要序列化返回,可以使用該特性。首先介紹Json.Net序列化的模式:OptOut 和 OptIn
OptOut 默認值,類中所有公有成員會被序列化,如果不想被序列化,可以用特性JsonIgnore
OptIn 默認情況下,所有的成員不會被序列化,類中的成員只有標有特性JsonProperty的纔會被序列化,當類的成員很多,但客戶端僅僅需要一部分數據時,很有用
不指定的情況下,類都可以序列化,所有的公共屬性都會處理。
忽略指定屬性實例:
[JsonObject(MemberSerialization.OptIn)]
public class Person
{
public int Age { get; set; }
[JsonProperty]
public string Name { get; set; }
public string Sex { get; set; }
public bool IsMarry { get; set; }
public DateTime Birthday { get; set; }
}
二、默認值處理
序列化時想忽略默認值屬性可以通過JsonSerializerSettings.DefaultValueHandling來確定,該值爲枚舉值
DefaultValueHandling.Ignore
序列化和反序列化時,忽略默認值
DefaultValueHandling.Include
序列化和反序列化時,包含默認值
不指定的情況下,序列化時包含 默認值。
三、空值處理
序列化時需要忽略值爲NULL的屬性,可以通過JsonSerializerSettings.NullValueHandling來確定,另外通過JsonSerializerSettings設置屬性是對序列化過程中所有屬性生效的,想單獨對某一個屬性生效可以使用JsonProperty,下面將分別展示兩個方式
四 、支持 非公共成員
序列化時默認都是處理公共成員,如果需要處理非公共成員,就要在該成員上加特性"JsonProperty"
[JsonProperty]
private int Height { get; set; }
五、日期格式處理
對於Dateime類型日期的格式化就比較麻煩了,系統自帶的會格式化成iso日期標準,但是實際使用過程中大多數使用的可能是yyyy-MM-dd 或者yyyy-MM-dd HH:mm:ss兩種格式的日期,解決辦法是可以將DateTime類型改成string類型自己格式化好,然後在序列化。如果不想修改代碼,可以採用下面方案實現。
Json.Net提供了IsoDateTimeConverter日期轉換這個類,可以通過JsnConverter實現相應的日期轉換
[JsonConverter(typeof(IsoDateTimeConverter))]
public DateTime Birthday { get; set; }
處理方式1.JsonSerializerSettings.DateFormatHandling 指定時間處理格式
處理方式2.DateTimeConverterBase 擴展重寫時間處理
示例如下:
using Newtonsoft.Json;
using Newtonsoft.Json.Converters;
namespace System
{
public class LongDateTimeConvert : IsoDateTimeConverter
{
public LongDateTimeConvert() : base()
{
base.DateTimeFormat = "yyyy/MM/dd HH:mm";
}
}
}
使用:
[Newtonsoft.Json.JsonConverter(typeof(LongDateTimeConvert))]
public DateTime CreateTime { get; set; }
六、自定義序列化的 字段名稱
實體中定義的屬性名可能不是自己想要的名稱,但是又不能更改實體定義,這個時候可以自定義序列化字段名稱。
[JsonProperty(PropertyName = "CName")]
public string Name { get; set; }
七、動態決定屬性是否序列化
承默認的DefaultContractResolver類,傳入需要輸出的屬性,擴展操作,指定JsonSerializerSettings.ContractResolver的實例
八、枚舉值的 自定義格式化處理
默認枚舉輸出的是枚舉的 值
public enum NotifyType
{
/// <summary>
/// Emil發送
/// </summary>
Mail=0,
/// <summary>
/// 短信發送
/// </summary>
SMS=1
}
public class TestEnmu
{
/// <summary>
/// 消息發送類型
/// </summary>
public NotifyType Type { get; set; }
}
JsonConvert.SerializeObject(new TestEnmu());
輸出結果: 現在改造一下,輸出"Type":"Mail"
public class TestEnmu
{
/// <summary>
/// 消息發送類型
/// </summary>
[JsonConverter(typeof(StringEnumConverter))]
public NotifyType Type { get; set; }
}
其它的都不變,在Type屬性上加上了JsonConverter(typeof(StringEnumConverter))表示將枚舉值轉換成對應的字符串,而StringEnumConverter是Newtonsoft.Json內置的轉換類型,最終輸出結果
九、自定義 類型轉換。
需要擴展類JsonConverter類 。
十、全局序列化設置
文章開頭提出了Null值字段怎麼不返回的問題,相應的在高級用法也給出了相應的解決方案使用jsetting.NullValueHandling = NullValueHandling.Ignore; 來設置不返回空值。這樣有個麻煩的地方,每個不想返回空值的序列化都需設置一下。
Newtonsoft.Json.JsonSerializerSettings setting = new Newtonsoft.Json.JsonSerializerSettings();
JsonConvert.DefaultSettings = new Func<JsonSerializerSettings>(() =>
{
//日期類型默認格式化處理
setting.DateFormatHandling = Newtonsoft.Json.DateFormatHandling.MicrosoftDateFormat;
setting.DateFormatString = "yyyy-MM-dd HH:mm:ss";
//空值處理
setting.NullValueHandling = NullValueHandling.Ignore;
//高級用法九中的Bool類型轉換 設置
setting.Converters.Add(new BoolConvert("是,否"));
return setting;
});
十一、序列化時 指定Key的處理方式,爲駝峯式
CamelCasePropertyNamesContractResolver
//設置序列化時key爲駝峯樣式
JsonSerializerSettings settings = new JsonSerializerSettings();
settings.ContractResolver = new CamelCasePropertyNamesContractResolver();
settings.Formatting = Formatting.Indented;
string str = JsonConvert.SerializeObject(menus, settings);
Console.WriteLine(str);
輸出 字符串格式化處理指定如下,默認沒有換行處理。
//Formatting.Indented 格式化json字符串數據,鋸齒狀的
string str = JsonConvert.SerializeObject(menus,Formatting.Indented);
十二、對於Newtonsoft.Json默認 已經處理過循環引用,
也就是對於關聯表的 對象或列表都不會序列化出來。
//設置循環引用,及引用類型序列化的層數。
//注:目前在 EF core中目前不支持延遲加載,無所謂循環引用了
JsonSerializerSettings settings = new JsonSerializerSettings();
settings.Formatting = Formatting.Indented;
settings.MaxDepth = 10; //設置序列化的最大層數
settings.ReferenceLoopHandling = ReferenceLoopHandling.Serialize;//指定如何處理循環引用,None--不序列化,Error-拋出異常,Serialize--仍要序列化
原文鏈接:https://blog.csdn.net/u011127019/article/details/72801033