.NET 8 Azure Functions中设置System.Text.JsonSerializer默认配置的正确方式
.NET 8 Azure Functions中设置System.Text.JsonSerializer默认配置的正确方式
我完全懂你的痛点——用.NET 8的Azure Functions新模板(依赖ConfigureFunctionsWebApplication而非旧的ConfigureFunctionWorker),想给所有返回JsonResult、OkObjectResult的请求统一设置System.Text.Json的序列化规则,结果直接配置JsonOptions完全没效果,用AddMvcCore()虽然能成,但又怕拖进来一堆用不上的依赖。
问题出在你配置的JsonOptions类型不对!你之前用的应该是Microsoft.AspNetCore.Http.Json.JsonOptions(针对HttpContext.Response.WriteAsJsonAsync这类底层API的配置),而JsonResult这类Mvc风格的结果,依赖的是**Microsoft.AspNetCore.Mvc.JsonOptions**——这是两个完全独立的配置类,所以之前的代码才会“完全没用”。
下面是正确的配置方式,既不会引入多余依赖,又能让所有JsonResult生效:
using Microsoft.AspNetCore.Mvc; // 确保引入这个命名空间 // ... 其他宿主构建代码 .ConfigureFunctionsWebApplication((hostBuilderContext, functionsWorkerApplicationBuilder) => { functionsWorkerApplicationBuilder.Services.Configure<JsonOptions>(options => { options.JsonSerializerOptions.PropertyNamingPolicy = JsonNamingPolicy.CamelCase; options.JsonSerializerOptions.Converters.Add(new JsonStringEnumConverter()); options.JsonSerializerOptions.PropertyNameCaseInsensitive = true; #if DEBUG options.JsonSerializerOptions.WriteIndented = true; #endif }); })
如果你的代码里同时用到了WriteAsJsonAsync这类底层Http API,需要给它们也配置相同规则的话,可以额外加一段配置:
// 可选:给底层Http响应的Json序列化配置相同规则 functionsWorkerApplicationBuilder.Services.Configure<Microsoft.AspNetCore.Http.Json.JsonOptions>(options => { options.SerializerOptions.PropertyNamingPolicy = JsonNamingPolicy.CamelCase; options.SerializerOptions.Converters.Add(new JsonStringEnumConverter()); // 其他和上面一致的配置项 });
这种方式只针对所需的Json序列化配置进行设置,不会像AddMvcCore()那样引入完整的Mvc控制器栈,完全符合你想要的“轻量”需求。
备注:内容来源于stack exchange,提问作者zu1b
相关产品推荐
相关产品推荐

