gpt4 book ai didi

c# - 让 NodaTime.Serialization.JsonNet 使用自定义日期格式

转载 作者:太空宇宙 更新时间:2023-11-03 22:51:02 27 4
gpt4 key购买 nike

我正在尝试反序列化一个 JSON,其中包含格式为 2017-10-26 13:32:11 Etc/GMT 的日期。 NodaTimeJson.NET 结合使用时似乎支持这一点和 NodaTime.Serialization.JsonNet .我在 StackOverflow 上找到了一些信息,这些信息使我可以仅使用 NodaTime 来完成这项工作:

var date = "2017-10-26 13:32:11 Etc/GMT";

var pattern = ZonedDateTimePattern.CreateWithInvariantCulture(
"yyyy'-'MM'-'dd HH':'mm':'ss z",
DateTimeZoneProviders.Tzdb
);

var result = pattern.Parse(date);

但是,当将此示例扩展为使用其他两个包反序列化 JSON 时,我无法使其正常工作。通过阅读文档和其他资源,我相信这应该有效:

public class DateObj
{
public ZonedDateTime Date { get; set; }
}

void Main()
{
var date = "2017-10-26 13:32:11 Etc/GMT";
var json = $"{{\"Date\": \"{date}\"}}";

var pattern = ZonedDateTimePattern.CreateWithInvariantCulture(
"yyyy-MM-dd HH:mm:ss z",
DateTimeZoneProviders.Serialization
);

var settings = new JsonSerializerSettings();
settings.ConfigureForNodaTime(pattern.ZoneProvider);
var dateObj = JsonConvert.DeserializeObject<DateObj>(json, settings);
}

但它会在最后一行抛出异常,提示 The value string does not match a quoted string in the pattern.正在解析的值:'2017-10-26^ 13:32:11 Etc/GMT'。 (^ 表示错误位置。)。我做错了什么?

最佳答案

目前,您正在创建一个特定的 ZonedDateTime 模式 - 但您实际上并没有在任何地方告诉 Json.NET 该模式。

如果这是唯一您需要使用的 Noda Time 类型,我建议您根本不要调用 ConfigureForNodaTime - 因为这将配置一个ZonedDateTime 格式错误的转换器。我们有code internal to NodaTime.Serialization.JsonNet更换转换器,但目前还没有公开。 (也许我们应该这样做……)

尽管创建一个转换器并为其配置设置很简单:

var settings = new JsonSerializerSettings
{
DateParseHandling = DateParseHandling.None,
Converters = { new NodaPatternConverter<ZonedDateTime>(pattern) }
};

这是在完整程序的上下文中的样子。请注意,我在这里明确使用 DateTimeZoneProviders.Tzdb,而不是 DateTimeZoneProviders.Serialization,因为您肯定有 TZDB 标识符:

using Newtonsoft.Json;
using NodaTime;
using NodaTime.Serialization.JsonNet;
using NodaTime.Text;
using System;

public class DateObj
{
public ZonedDateTime Date { get; set; }
}

class Program
{
static void Main()
{
var date = "2017-10-26 13:32:11 Etc/GMT";
var json = $"{{\"Date\": \"{date}\"}}";

var pattern = ZonedDateTimePattern.CreateWithInvariantCulture(
"yyyy-MM-dd HH:mm:ss z",
DateTimeZoneProviders.Tzdb
);

var settings = new JsonSerializerSettings
{
DateParseHandling = DateParseHandling.None,
Converters = { new NodaPatternConverter<ZonedDateTime>(pattern) }
};
var dateObj = JsonConvert.DeserializeObject<DateObj>(json, settings);
Console.WriteLine(dateObj.Date);
}
}

关于c# - 让 NodaTime.Serialization.JsonNet 使用自定义日期格式,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47311121/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com