using NetAdmin.Host.Filters; using NetAdmin.Host.Utils; namespace NetAdmin.Host.Extensions; /// /// IMvcBuilder 扩展方法 /// [SuppressSniffer] // ReSharper disable once InconsistentNaming public static class IMvcBuilderExtensions { /// /// api结果处理器 /// public static IMvcBuilder AddDefaultApiResultHandler(this IMvcBuilder me) { return me.AddInjectWithUnifyResult(injectOptions => { injectOptions.ConfigureSwaggerGen( genOptions => { // 替换自定义的EnumSchemaFilter,支持多语言Resx资源 (需将SpecificationDocumentSettings.EnableEnumSchemaFilter配置为false) genOptions .SchemaFilter< SwaggerEnumSchemaFixer>(); // 将程序集版本号与OpenApi版本号同步 foreach (var doc in genOptions .SwaggerGeneratorOptions .SwaggerDocs) { doc.Value.Version = FileVersionInfo .GetVersionInfo( Assembly .GetEntryAssembly()! .Location) .ProductVersion; } }); }); } /// /// Json序列化配置 /// /// /// 正反序列化规则: /// object->json: /// 1、值为 null 或 default 的节点将被忽略 /// 2、值为 "" 的节点将被忽略。 /// 3、值为 [] 的节点将被忽略。 /// 4、节点名:大驼峰转小驼峰 /// 5、不转义除对json结构具有破坏性(如")以外的任何字符 /// 6、大数字原样输出(不加引号),由前端处理js大数兼容问题 /// json->object: /// 1、允许带注释的json(自动忽略) /// 2、允许尾随逗号 /// 3、节点名大小写不敏感 /// 4、允许带双引号的数字 /// 5、值为"" 转 null /// 6、值为[] 转 null /// public static IMvcBuilder AddJsonSerializer(this IMvcBuilder me, bool enumToString = false) { return me.AddJsonOptions(options => SetJsonOptions(enumToString, options)); } /// /// 设置Json选项 /// public static void SetJsonOptions(bool enumToString, JsonOptions options) { ////////////////////////////// json -> object // 允许带注释 options.JsonSerializerOptions.ReadCommentHandling = JsonCommentHandling.Skip; // 允许尾随逗号 options.JsonSerializerOptions.AllowTrailingCommas = true; // 允许数字带双引号 options.JsonSerializerOptions.NumberHandling = JsonNumberHandling.AllowReadingFromString; // 大小写不敏感 options.JsonSerializerOptions.PropertyNameCaseInsensitive = true; // 允许读取引号包围的数字 options.JsonSerializerOptions.NumberHandling = JsonNumberHandling.AllowReadingFromString; ///////////////////////////// object -> json // 转小驼峰 options.JsonSerializerOptions.DictionaryKeyPolicy = JsonNamingPolicy.CamelCase; options.JsonSerializerOptions.PropertyNamingPolicy = JsonNamingPolicy.CamelCase; // 不严格转义 options.JsonSerializerOptions.Encoder = JavaScriptEncoder.UnsafeRelaxedJsonEscaping; // 写入时,忽略null、default options.JsonSerializerOptions.DefaultIgnoreCondition = JsonIgnoreCondition.WhenWritingNull; ////////////////////////////// object <-> json // "" 转 null 双向 options.JsonSerializerOptions.Converters.Add(new ToNullIfEmptyStringConverter()); // [] 转 null 双向 options.JsonSerializerOptions.TypeInfoResolver = new CollectionJsonTypeInfoResolver(); // 日期格式 2023-01-18 20:02:12 _ = options.JsonSerializerOptions.Converters.AddDateTimeTypeConverters(); // object->json 枚举显名 而非数字 ,json->object 可以枚举名 也可以数值 if (enumToString) { options.JsonSerializerOptions.Converters.Add(new JsonStringEnumConverter(JsonNamingPolicy.CamelCase)); } // 快捷访问方式 GlobalStatic.JsonSerializerOptions = options.JsonSerializerOptions; } }