"Cannot convert value to NodaTime.LocalDateTime"

"Cannot convert value to NodaTime.LocalDateTime"

我正在使用 .Net Core 3.1 作为我的框架。

我在启动时有这个设置:

using NodaTime;
using NodaTime.Serialization.SystemTextJson;

services.AddControllers()
        .AddJsonOptions(options =>
        {
            var settings = options.JsonSerializerOptions;

            settings.AllowTrailingCommas = false;
            settings.ConfigureForNodaTime(DateTimeZoneProviders.Tzdb);
            settings.WithIsoDateIntervalConverter();
            settings.WithIsoIntervalConverter();
        });

这是我的 API 模型:

public class CreateDto
{
    public int Status { get; set; }

    public Guid ApprovedBy { get; set; }

    public LocalDateTime DateFrom { get; set; }

    public LocalDateTime DateTo { get; set; }
}

这是我的控制器:

[HttpPost]
public async Task<IActionResult> Create([FromBody] CreateDto createEntity)
{
    var createdEntity = await _service.Create(createEntity);
    return Ok(createdEntity);
}

每次我使用 Postman 时 JSON 正文:

{
    "Status": 1,
    "ApprovedBy": "970a50c5-ae21-4f41-bea9-691f8c60224c",
    "DateFrom": "2020-04-01T00:00:00.000Z",
    "DateTo": "2020-04-05T23:59:59.000Z"
}

我总是遇到这个错误:

{
    "errors": {
        "DateTo": [
            "Cannot convert value to NodaTime.LocalDateTime"
        ],
        "DateFrom": [
            "Cannot convert value to NodaTime.LocalDateTime"
        ]
    },
    "type": "https://tools.ietf.org/html/rfc7231#section-6.5.1",
    "title": "One or more validation errors occurred.",
    "status": 400,
    "traceId": "|4a836dd3-4ce779bc5503ac63."
}

问题:我的启动配置是否遗漏了什么?如果没有,我该如何解决这个错误?

您的 JSON 不代表 LocalDateTime 值 - 它代表 Instant(或 OffsetDateTime)值,因为最后的 "Z" .

所以你的选择是:

  • 将模型中的类型更改为 InstantOffsetDateTime
  • 更改您要发送的数据 - 只需删除每个字符串末尾的 'Z'