Asp .Net Core 系列:Asp .Net Core 集成 Newtonsoft.Json

簡介

Newtonsoft.Json是一個在.NET環境下開源的JSON格式序列化和反序列化的類庫。它可以將.NET對象轉換爲JSON格式的字符串,也可以將JSON格式的字符串轉換爲.NET對象。這個類庫在.NET開發中被廣泛使用,因爲它功能強大、易於使用,並且有良好的性能。

使用Newtonsoft.Json,你可以方便地進行以下操作:

  1. 序列化:將.NET對象轉換爲JSON字符串。這通常用於將數據發送到Web服務或保存到文件。
  2. 反序列化:將JSON字符串轉換爲.NET對象。這通常用於從Web服務接收數據或從文件中讀取數據。
  3. JSON數據的操作:Newtonsoft.Json提供了豐富的API,允許你對JSON數據進行各種操作,如修改、查詢、添加和刪除等。

要使用Newtonsoft.Json,你首先需要將其添加到你的項目中。你可以通過NuGet包管理器來安裝它。一旦安裝完成,你就可以在你的代碼中使用它。

官網:https://www.newtonsoft.com/json/help/html/Introduction.htm

序列化屬性

https://www.newtonsoft.com/json/help/html/SerializationSettings.htm

Converters: 一個包含自定義轉換器的集合,這些轉換器用於將對象序列化爲 JSON 或從 JSON 反序列化爲對象。
DateFormatHandling: 控制日期和時間格式的處理方式。例如,可以將日期格式化爲特定的字符串格式,或者使用 ISO 8601 格式。
DateTimeZoneHandling: 控制日期時間值的時區處理方式。可以選擇本地、UTC 或不處理。
IsoDateTimeFormat: 一個布爾值,用於指示是否將日期時間值格式化爲 ISO 8601 格式。
SerializationMemberSelector: 一個委託,允許您自定義哪些屬性將被序列化。
ReferenceLoopHandling: 控制循環引用的處理方式。可以選擇忽略、警告或拋出異常。
MissingMemberHandling: 控制缺少成員的處理方式。可以選擇忽略、拋出異常或引發警告。
DefaultSettings: 使用默認設置進行序列化。這些設置可以覆蓋應用程序中的其他特定設置。
ContractResolver: 用於控制 JSON.NET 如何推斷和創建 JSON 合同。這允許您自定義命名約定、忽略默認屬性等。
NamingStrategy: 用於控制 JSON.NET 中的命名約定。例如,可以使用 CamelCase 或 PascalCase 命名約定。
StringEscapeHandling: 控制字符串轉義字符的處理方式。可以選擇逃逸或不逃逸轉義字符。
ReferenceResolutionPolicy: 控制如何處理重複引用相同的對象。可以選擇警告、忽略或拋出異常。
NullValueHandling: 控制如何處理空值。可以選擇忽略、表示爲 null 或使用默認值。

序列化特性

  • JsonObjectAttribute - 放置在類上以控制如何將它們序列化爲 JSON 對象。
  • JsonArrayAttribute - 放置在集合上以控制如何將它們序列化爲 JSON 數組。
  • JsonDictionaryAttribute - 放置在字典上以控制如何將它們序列化爲 JSON 對象。
  • JsonPropertyAttribute - 放置在字段和屬性上,以控制如何將它們序列化爲 JSON 對象中的屬性。
  • JsonConverterAttribute - 放置在類或字段和屬性上,以指定序列化期間應使用哪個 JsonConverter。
  • JsonExtensionDataAttribute - 放置在集合字段或屬性上,用於將沒有匹配類成員的屬性反序列化到指定的集合中,並在序列化期間寫入值。
  • JsonConstructorAttribute - 放置在構造函數上以指定應在反序列化期間使用它來創建類。

LINQ To JSON

NQ to JSON 是用於處理 JSON 對象的 API。它在設計時考慮了 LINQ,可以快速查詢和創建 JSON 對象。LINQ to JSON 位於 Newtonsoft.Json.Linq 命名空間下。

JObject o = JObject.Parse(@"{
  'CPU': 'Intel',
  'Drives': [
    'DVD read/writer',
    '500 gigabyte hard drive'
  ]
}");

string cpu = (string)o["CPU"];
// Intel

string firstDrive = (string)o["Drives"][0];
// DVD read/writer

IList<string> allDrives = o["Drives"].Select(t => (string)t).ToList();

性能技巧

對比 System.Text.Json

https://learn.microsoft.com/zh-cn/dotnet/standard/serialization/system-text-json/migrate-from-newtonsoft?pivots=dotnet-8-0#table-of-differences

Newtonsoft.Json 功能 System.Text.Json 等效
默認情況下不區分大小寫的反序列化 ✔️ PropertyNameCaseInsensitive 全局設置
Camel 大小寫屬性名稱 ✔️ PropertyNamingPolicy 全局設置
對屬性名稱採用蛇形命名法 ✔️ 蛇形命名法命名策略
最小字符轉義 ✔️ 嚴格字符轉義,可配置
NullValueHandling.Ignore 全局設置 ✔️ DefaultIgnoreCondition 全局選項
允許註釋 ✔️ ReadCommentHandling 全局設置
允許尾隨逗號 ✔️ AllowTrailingCommas 全局設置
自定義轉換器註冊 ✔️ 優先級順序不同
默認情況下無最大深度 ✔️ 默認最大深度爲 64,可配置
PreserveReferencesHandling 全局設置 ✔️ ReferenceHandling 全局設置
序列化或反序列化帶引號的數字 ✔️ [NumberHandling 全局設置,JsonNumberHandling] 特性
反序列化爲不可變類和結構 ✔️ JsonConstructor,C# 9 記錄
支持字段 ✔️ [IncludeFields 全局設置,JsonInclude] 特性
DefaultValueHandling 全局設置 ✔️ DefaultIgnoreCondition 全局設置
[JsonProperty] 上的 NullValueHandling 設置 ✔️ JsonIgnore 特性
[JsonProperty] 上的 DefaultValueHandling 設置 ✔️ JsonIgnore 特性
反序列化具有非字符串鍵的 Dictionary ✔️ 受支持
支持非公共屬性資源庫和 Getter ✔️ JsonInclude 特性
[JsonConstructor] 特性 ✔️ [JsonConstructor] 特性
ReferenceLoopHandling 全局設置 ✔️ ReferenceHandling 全局設置
回調 ✔️ 回調
NaN、Infinity、-Infinity ✔️ 受支持
[JsonProperty] 特性上的 Required 設置 ✔️ [JsonRequired] 特性和 C# 必需的修飾符
DefaultContractResolver 用於忽略屬性 ✔️ DefaultJsonTypeInfoResolver 類
多態序列化 ✔️ [JsonDerivedType] 特性
多態反序列化 ✔️ [JsonDerivedType] 特性上的類型鑑別器
反序列化字符串枚舉值 ✔️ 反序列化字符串枚舉值
MissingMemberHandling 全局設置 ✔️ 處理缺少的成員
在沒有資源庫的情況下填充屬性 ✔️ 在沒有資源庫的情況下填充屬性
ObjectCreationHandling 全局設置 ✔️ 重用而不是替換屬性
支持範圍廣泛的類型 ⚠️ ⚠
將推斷類型反序列化爲 object 屬性 ⚠️ ⚠
將 JSON null 文本反序列化爲不可爲 null 的值類型 ⚠️ ⚠
DateTimeZoneHandlingDateFormatString 設置 ⚠️ ⚠
JsonConvert.PopulateObject 方法 ⚠️ ⚠
支持 System.Runtime.Serialization 特性 ⚠️ ⚠
JsonObjectAttribute ⚠️ ⚠
允許不帶引號的屬性名稱 設計上不受支持
字符串值前後允許單引號 設計上不受支持
對字符串屬性允許非字符串 JSON 值 設計上不受支持
TypeNameHandling.All 全局設置 設計上不受支持
支持 JsonPath 查詢 不支持
可配置的限制 不支持

封裝 JsonHelper 幫助類

    /// <summary>
    /// Json序列化反序列化類
    /// </summary>
    public class JsonHelper
    {
        private static readonly JsonSerializerSettings _jsonSerializerSettings;

        static JsonHelper()
        {
            _jsonSerializerSettings = DefaultSerializerSettings;
        }

      
        private static JsonSerializerSettings DefaultSerializerSettings
        {
            get
            {
                var settings = new JsonSerializerSettings();

                // 設置如何將日期寫入JSON文本。默認值爲“IsoDateFormat”
                //settings.DateFormatHandling = DateFormatHandling.IsoDateFormat;
                // 設置在序列化和反序列化期間如何處理DateTime時區。默認值爲 “RoundtripKind”
                //settings.DateTimeZoneHandling = DateTimeZoneHandling.RoundtripKind;
                // 設置在序列化和反序列化期間如何處理默認值。默認值爲“Include”
                //settings.DefaultValueHandling = DefaultValueHandling.Include;
                // 設置寫入JSON文本時DateTime和DateTimeOffset值的格式,以及讀取JSON文本時預期的日期格式。默認值爲“ yyyy'-'MM'-'dd'T'HH':'mm':'ss.FFFFFFFK ”。
                settings.DateFormatString = "yyyy-MM-dd HH:mm:ss";
                // 設置在序列化和反序列化期間如何處理空值。默認值爲“Include”
                //settings.NullValueHandling = NullValueHandling.Include;
                // 設置序列化程序在將.net對象序列化爲JSON時使用的契約解析器
                settings.ContractResolver = new CamelCasePropertyNamesContractResolver();
                // 設置如何處理引用循環(例如,類引用自身)。默認值爲“Error”。
                settings.ReferenceLoopHandling = ReferenceLoopHandling.Ignore;
                // 是否格式化文本
                settings.Formatting = Formatting.Indented;
                //支持將Enum 由默認 Number類型 轉換爲String
                //settings.SerializerSettings.Converters.Add(new StringEnumConverter());
                //將long類型轉爲string
                settings.SerializerSettings.Converters.Add(new NumberConverter(NumberConverterShip.Int64));

                return settings;
            }
        }

        public static T Deserialize<T>(string json, JsonSerializerSettings serializerSettings = null)
        {
            if (string.IsNullOrEmpty(json)) return default;

            if (serializerSettings == null) serializerSettings = _jsonSerializerSettings;

            //值類型和String類型
            if (typeof(T).IsValueType || typeof(T) == typeof(string))
            {
                return (T)Convert.ChangeType(json, typeof(T));
            }

            return JsonConvert.DeserializeObject<T>(json, serializerSettings);
        }

        public static string Serialize<T>(T obj, JsonSerializerSettings serializerSettings = null)
        {
            if (obj is null) return string.Empty;
            if (obj is string) return obj.ToString();
            if (serializerSettings == null) serializerSettings = _jsonSerializerSettings;
            return JsonConvert.SerializeObject(obj, serializerSettings);
        }
    }

全局配置 Newtonsoft.Json

 public static class JsonSerializeExtensions
 {
     public static IMvcBuilder AddMCodeJsonOptions(this IMvcBuilder builder, Action<MvcNewtonsoftJsonOptions> configure = null)
     {
         /*
            
          */
         builder.AddNewtonsoftJson(options =>
         {
             // 設置如何將日期寫入JSON文本。默認值爲“IsoDateFormat”
             //options.SerializerSettings.DateFormatHandling = DateFormatHandling.IsoDateFormat;
             // 設置在序列化和反序列化期間如何處理DateTime時區。默認值爲 “RoundtripKind”
             //options.SerializerSettings.DateTimeZoneHandling = DateTimeZoneHandling.RoundtripKind;
             // 設置在序列化和反序列化期間如何處理默認值。默認值爲“Include”
             //options.SerializerSettings.DefaultValueHandling = DefaultValueHandling.Include;
             // 設置寫入JSON文本時DateTime和DateTimeOffset值的格式,以及讀取JSON文本時預期的日期格式。默認值爲“ yyyy'-'MM'-'dd'T'HH':'mm':'ss.FFFFFFFK ”。
             options.SerializerSettings.DateFormatString = "yyyy-MM-dd HH:mm:ss";
             // 設置在序列化和反序列化期間如何處理空值。默認值爲“Include”
             //options.SerializerSettings.NullValueHandling = NullValueHandling.Include;
             // 設置序列化程序在將.net對象序列化爲JSON時使用的契約解析器
             options.SerializerSettings.ContractResolver = new CamelCasePropertyNamesContractResolver();
             // 設置如何處理引用循環(例如,類引用自身)。默認值爲“Error”。
             options.SerializerSettings.ReferenceLoopHandling = ReferenceLoopHandling.Ignore;
             // 是否格式化文本
             options.SerializerSettings.Formatting = Formatting.Indented;
              //將long類型轉爲string
             options.SerializerSettings.Converters.Add(new NumberConverter(NumberConverterShip.Int64));
             configure.Invoke(options);
         });
         return builder;
     }
 }
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章