【问题标题】:How do I configure NodaTime Serialization in .Net 5.0如何在 .Net 5.0 中配置 NodaTime 序列化
【发布时间】:2021-06-30 04:08:29
【问题描述】:

尝试设置全新的 .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);
                });
        }

【问题讨论】:

    标签: c# .net-core asp.net-core-webapi nodatime


    【解决方案1】:

    理想情况下,您应该改用 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 日历中,但您不太可能需要它。)

    【讨论】:

      猜你喜欢
      • 2022-07-28
      • 1970-01-01
      • 2013-01-25
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-11-06
      相关资源
      最近更新 更多