如何在 .Net 5.0 中配置 NodaTime 序列化

问题描述

尝试设置全新的 .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 日历中的验证,但您不太可能需要它。)