c# – 每个请求的ASP.NET Core API JSON serializersettings
根据请求中的某些值(标题或URL),我想更改DTO对象的序列化.
为什么?好吧,我已将[JsonProperty(“A”)]应用于我的DTO,但根据客户端(网站或移动应用程序),它是否要使用该属性. 我开始了 services .AddMvc() .AddJsonOptions(opt => { #if DEBUG opt.SerializerSettings.ContractResolver = new NoJsonPropertyNameContractResolver(); #endif } 因此,在调试时,我获得了具有完整属性名称的JSON.我使用JsonProperty属性来缩短响应JSON,这适用于移动应用程序(Xamarin),后者反序列化回到相同的DTO. 我开始使用中间件类来对客户标头值做出反应,这有效,但现在我不知道如何进入JSON SerializerSettings.搜索网络但找不到它. 在搜索时我读过有关InputFormatters和OutputFormatters,以及内容协商,但我不知道我必须去哪个方向. 我不想使用不同的设置两次部署相同的API. 更新 解决方法
这有两个选择:
1.手动格式化 您通过services.AddMvc()设置的选项.AddJsonOptions()在DI中注册,您可以将其注入您的控制器和服务: public HomeController(IOptions<MvcJsonOptions> optionsAccessor) { JsonSerializerSettings jsonSettings = optionsAccessor.Value.SerializerSettings; } 要按请求覆盖这些序列化设置,您可以使用Json方法或创建JsonResult实例: public IActionResult Get() { return Json(data,new JsonSerializerSettings()); return new JsonResult(data,new JsonSerializerSettings()); } 2.结果过滤器替换JSON输出 public class ModifyResultFilter : IAsyncResultFilter { public ModifyResultFilter(IOptions<MvcJsonOptions> optionsAccessor) { _globalSettings = optionsAccessor.Value.SerializerSettings; } public async Task OnResultExecutionAsync( ResultExecutingContext context,ResultExecutionDelegate next) { var originResult = context.Result as JsonResult; context.Result = new JsonResult(originResult.Value,customSettings); await next(); } } 在动作/控制器上使用它: [ServiceFilter(typeof(ModifyResultFilter ))] public IActionResult Index() {} 或者创建自定义属性,如documentation中所述: [ModifyResultAttribute] public IActionResult Index() {} 不要忘记在DI中注册过滤器. (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |