.net6 api 中的 DateOnly Json 转换

Posted

技术标签:

【中文标题】.net6 api 中的 DateOnly Json 转换【英文标题】:DateOnly Json Conversion in .net6 api 【发布时间】:2021-11-24 16:35:42 【问题描述】:

tl;博士: 如何将 DateOnly JsonConverter 添加到 .net6 web api 的应用程序配置中?

我有一个带有 DateOnly 属性的对象,我正在从控制器中返回它。当我提出请求时,我收到错误“不支持 'System.DateOnly' 实例的序列化和反序列化”。

我了解在 .net6 (https://github.com/dotnet/runtime/issues/53539) 中对 DateOnly 和 TimeOnly 进行反序列化/序列化存在限制,并且我遵循了自定义 JsonConverter 的推荐使用方法。但是我遇到的问题是我在哪里初始化转换器。

我尝试在 Web 应用程序构建器中添加转换器....


builder.Services
    .AddControllers()
    .AddJsonOptions(options => options.JsonSerializerOptions.Converters.Add(new DateOnlyConverter()));

但没有运气。

然后我尝试专门配置它

builder.Services.Configure<JsonSerializerOptions>(options =>
    options.Converters.Add(new DateOnlyConverter()));

那里也没有运气。

所以我尝试使用选项Results.Json(status, options) 中的转换器从控制器返回Results.Json。即使这样也没有用。

确实有效的是直接向属性添加属性

[property: JsonConverter(typeof(DateOnlyConverter))]
    DateOnly DateOrdered,

我宁愿不必在每次使用 DateOnly 时都添加此属性,并且我真的不清楚当转换器配置为 WebApplication 的一部分时是什么阻止了转换器被调用。 我在 .net5 应用程序中做过类似的事情,并假设 IHostBuilder 和 WebApplicationBuilder 之间的一些细微差别可能会导致问题。

编辑: 值得注意的是,我正在使用新的最小 API。但即使是微软也指出 Json 序列化是可配置的in the docs here。文档显示的语法与常用的 builder.Services.Configure&lt;JsonOptions&gt; 略有不同,所以我认为这可能是问题所在。也许最小的 api 的配置处理方式不同。但并非如此。至少,使用最小 api 文档中的建议配置并没有解决问题。

【问题讨论】:

能否请您在某处(在 github :-) 上发布简短的重现,其中包含完整的设置、控制器和模型。 你看到this转换器的实现了吗?它在你的链接上。也不行? gitlab.com/disperdercreare/net6-api-test @AndrewSilver 我确实看到了那个实现。这是我用的转换器。转换器工作正常,在序列化时调用它的问题。除非我将 JsonConverter 属性直接添加到属性中,否则它似乎会忽略它。 【参考方案1】:

好的,经过足够的搜索,我能够找到答案。是的,最小 api 的配置是分开的。文档就在上面,他们描述了使用 builder.Services.Configure&lt;JsonOptions&gt;(options =&gt; ...) 配置最小 api 的 json 序列化。希望这个答案能在未来帮助那些急于仔细阅读文档的人。

【讨论】:

以上是关于.net6 api 中的 DateOnly Json 转换的主要内容,如果未能解决你的问题,请参考以下文章

Mark!20 个 .NET 6 新增的 API

在 .NET 6 中使用 DATEONLY 和 TIMEONLY

.NET 6新特性试用 | DateOnly和TimeOnly类型

在.NET 6中使用DateOnly和TimeOnly

DateOnly和TimeOnly类型居然不能序列化!!! .Net 6下实现自定义JSON序列化

.NET 6.0 Web api 中的 CORS