问题描述
尝试设置全新的 .Net 5.0 API 并运行该服务,但我想使用 NodaTime,但我不知道如何使序列化设置工作。下面似乎是正确的,但得到,
The JSON value Could not be converted to NodaTime.LocalDate
尝试发送时
{
"date": "2021-Jan-01"
}
这是我当前的配置:
using Microsoft.AspNetCore.Builder;
using Microsoft.AspNetCore.Hosting;
using Microsoft.Extensions.DependencyInjection;
using Microsoft.Extensions.Hosting;
using NodaTime;
using NodaTime.Serialization.JsonNet;
namespace src
{
public class Startup
{
public void ConfigureServices(IServiceCollection services)
{
services
.AddControllers()
.AddJsonoptions(_ =>
{
new JsonSerializer()
.ConfigureForNodaTime(DateTimeZoneProviders.Tzdb);
});
}
解决方法
理想情况下,您应该使用 ISO-8601 日期(因此“2021-01-01”而不是“2021-Jan-01”)。这是表示日期的标准化方式,并且不使用区分文化的月份名称。
如果您确实需要使用这种格式,则需要删除由 NodaTime.Serialization.JsonNet 填充的 LocalDate
转换器并添加一个新的转换器。
您可以从 here 复制“用新的转换器替换转换器”代码 - 您需要复制代码有点遗憾,但这并不是我真正想公开的内容。
幸运的是,为 LocalDate
创建一个新的转换器很容易:
var pattern = LocalDatePattern.CreateWithInvariantCulture("uuuu'-'MMM'-'dd");
var converter = new NodaPatternConverter<LocalDate>(pattern);
(这不会像内置转换器那样执行 LocalDate
在 ISO 日历中的验证,但您不太可能需要它。)