如何使用NodaTime和'System.Text.Json'反序列化没有最终Z的'Instant'?

How to deserialize an `Instant` without the final Z with NodaTime and `System.Text.Json`?

提问人:mcont 提问时间:11/15/2023 更新时间:11/15/2023 访问量:19

问:

我需要使用 反序列化 JSON 字符串。NET包含UTC的日期时间,但我无法使用NodaTime转换器,因为字符串缺少最终时间(即使它是UTC)。System.Text.JsonInstantZ

我正在使用以下代码:

public record Item(Instant date);
var options = new JsonSerializerOptions()
    .ConfigureForNodaTime(DateTimeZoneProviders.Tzdb);

var item = JsonSerializer.Deserialize<Item>(options);

我收到以下错误:

 ---> System.Text.Json.JsonException: Cannot convert value to NodaTime.Instant
 ---> NodaTime.Text.UnparsableValueException: The value string does not match a quoted string in the pattern. Value being parsed: '2023-10-20T10:10:22^'. (^ indicates error position.)
C# JSON net-core system.text.json nodatime

评论


答:

-1赞 mcont 11/15/2023 #1

解决方案是手动构建预期格式的转换器:

var options = new JsonSerializerOptions
{
    Converters =
    {
        new NodaPatternConverter<Instant>(InstantPattern.CreateWithInvariantCulture("uuuu-MM-ddTHH:mm:ss"))
    }
};

如果您想使用另一种类型(例如默认转换器不支持的格式)执行此操作,则类似的事情:LocalDateTime

var options = new JsonSerializerOptions
{
    Converters =
    {
        new NodaPatternConverter<LocalDateTime>(LocalDateTimePattern.CreateWithInvariantCulture("uuuu-MM-dd HH:mm:ss"))
    }
};