Jelajahi Sumber

启用 NewtonsoftJson ,原因是 System.Text.Json 不好用

tian_z 4 tahun lalu
induk
melakukan
27ac3c7648

+ 1 - 0
Admin.NET/Admin.NET.Core/Admin.NET.Core.csproj

@@ -24,6 +24,7 @@
     <PackageReference Include="Furion.Extras.ObjectMapper.Mapster" Version="3.2.0" />
     <PackageReference Include="Furion.Pure" Version="3.2.0" />
     <PackageReference Include="Magicodes.IE.Excel" Version="2.6.4" />
+    <PackageReference Include="Microsoft.AspNetCore.Mvc.NewtonsoftJson" Version="6.0.5" />
     <PackageReference Include="MySql.Data" Version="8.0.29" />
     <PackageReference Include="OnceMi.AspNetCore.OSS" Version="1.1.5" />
     <PackageReference Include="SKIT.FlurlHttpClient.Wechat.Api" Version="2.13.0" />

+ 28 - 0
Admin.NET/Admin.NET.Core/Admin.NET.Core.xml

@@ -2320,6 +2320,34 @@
             logo显示
             </summary>
         </member>
+        <member name="T:Admin.NET.Core.NewtonsoftJsonSerializerProvider">
+            <summary>
+            自定义序列化提供器Newtonsoft
+            </summary>
+        </member>
+        <member name="M:Admin.NET.Core.NewtonsoftJsonSerializerProvider.Serialize(System.Object,System.Object)">
+            <summary>        
+            序列化对象        
+            </summary>        
+            <param name="value"></param>        
+            <param name="jsonSerializerOptions"></param>        
+            <returns></returns>        
+        </member>
+        <member name="M:Admin.NET.Core.NewtonsoftJsonSerializerProvider.Deserialize``1(System.String,System.Object)">
+            <summary>        
+            反序列化字符串        
+            </summary>        
+            <typeparam name="T"></typeparam>        
+            <param name="json"></param>        
+            <param name="jsonSerializerOptions"></param>        
+            <returns></returns>        
+        </member>
+        <member name="M:Admin.NET.Core.NewtonsoftJsonSerializerProvider.GetSerializerOptions">
+            <summary>        
+            返回读取全局配置的 JSON 选项        
+            </summary>        
+            <returns></returns>        
+        </member>
         <member name="T:Admin.NET.Core.ObjectExtension">
             <summary>
             对象拓展类

+ 44 - 0
Admin.NET/Admin.NET.Core/Extension/NewtonsoftJsonSerializerProvider .cs

@@ -0,0 +1,44 @@
+using Furion;
+using Furion.DependencyInjection;
+using Furion.JsonSerialization;
+using Microsoft.AspNetCore.Mvc;
+using Newtonsoft.Json;
+
+namespace Admin.NET.Core
+{
+    /// <summary>
+    /// 自定义序列化提供器Newtonsoft
+    /// </summary>
+    public class NewtonsoftJsonSerializerProvider : IJsonSerializerProvider, ISingleton
+    {
+        /// <summary>        
+        /// 序列化对象        
+        /// </summary>        
+        /// <param name="value"></param>        
+        /// <param name="jsonSerializerOptions"></param>        
+        /// <returns></returns>        
+        public string Serialize(object value, object jsonSerializerOptions = null)
+        {
+            return JsonConvert.SerializeObject(value, (jsonSerializerOptions ?? GetSerializerOptions()) as JsonSerializerSettings);
+        }
+        /// <summary>        
+        /// 反序列化字符串        
+        /// </summary>        
+        /// <typeparam name="T"></typeparam>        
+        /// <param name="json"></param>        
+        /// <param name="jsonSerializerOptions"></param>        
+        /// <returns></returns>        
+        public T Deserialize<T>(string json, object jsonSerializerOptions = null)
+        {
+            return JsonConvert.DeserializeObject<T>(json, (jsonSerializerOptions ?? GetSerializerOptions()) as JsonSerializerSettings);
+        }
+        /// <summary>        
+        /// 返回读取全局配置的 JSON 选项        
+        /// </summary>        
+        /// <returns></returns>        
+        public object GetSerializerOptions()
+        {
+            return App.GetOptions<MvcNewtonsoftJsonOptions>()?.SerializerSettings;
+        }
+    }
+}

+ 14 - 10
Admin.NET/Admin.NET.Web.Core/Startup.cs

@@ -4,6 +4,8 @@ using Microsoft.AspNetCore.Builder;
 using Microsoft.AspNetCore.Hosting;
 using Microsoft.Extensions.DependencyInjection;
 using Microsoft.Extensions.Hosting;
+using Newtonsoft.Json;
+using Newtonsoft.Json.Serialization;
 using OnceMi.AspNetCore.OSS;
 using Serilog;
 using System.Text.Encodings.Web;
@@ -38,16 +40,18 @@ namespace Admin.NET.Web.Core
             services.AddTaskScheduler();
 
             services.AddControllersWithViews()
-                .AddMvcFilter<RequestActionFilter>()
-                .AddJsonOptions(options =>
-                {
-                    options.JsonSerializerOptions.PropertyNamingPolicy = JsonNamingPolicy.CamelCase; // 响应驼峰命名
-                    options.JsonSerializerOptions.PropertyNameCaseInsensitive = true; // 忽略大小写
-                    options.JsonSerializerOptions.ReferenceHandler = ReferenceHandler.IgnoreCycles; // 忽略循环引用
-                    options.JsonSerializerOptions.Converters.AddDateFormatString("yyyy-MM-dd HH:mm:ss"); // 时间格式化
-                    options.JsonSerializerOptions.Encoder = JavaScriptEncoder.Create(UnicodeRanges.All); // 中文编码
-                })
-                .AddInjectWithUnifyResult<AdminResultProvider>();
+               .AddMvcFilter<RequestActionFilter>()
+               .AddNewtonsoftJson(options =>
+               {
+                    // 首字母小写(驼峰样式)
+                   options.SerializerSettings.ContractResolver = new CamelCasePropertyNamesContractResolver();
+                    // 时间格式化
+                   options.SerializerSettings.DateFormatString = "yyyy-MM-dd HH:mm:ss";
+                    // 忽略循环引用
+                   options.SerializerSettings.ReferenceLoopHandling = ReferenceLoopHandling.Ignore;
+                    // 忽略空值
+                    // options.SerializerSettings.NullValueHandling = NullValueHandling.Ignore;
+               }).AddInjectWithUnifyResult<AdminResultProvider>();
 
             // 注册日志事件订阅者(支持自定义消息队列组件)
             services.AddEventBus(builder =>