C# Newtonsoft.Json JsonSerializerSettings配置序列化操作

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

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章