让 NodaTime.Serialization.JsonNet 使用自定义日期格式
Getting NodaTime.Serialization.JsonNet to work with a custom date format
我正在尝试反序列化 JSON,其中包含 2017-10-26 13:32:11 Etc/GMT
格式的日期。 NodaTime seems to support this when combined with Json.NET and NodaTime.Serialization.JsonNet。我在 Whosebug 上找到了一些信息,这些信息使我能够正常工作,仅使用 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. Value being parsed: '2017-10-26^ 13:32:11 Etc/GMT'. (^ indicates error position.)
。我做错了什么?
目前,您正在创建一个特定的 ZonedDateTime
模式 - 但您实际上并没有在任何地方告诉 Json.NET 该模式。
如果这是您需要使用的 only 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);
}
}
我正在尝试反序列化 JSON,其中包含 2017-10-26 13:32:11 Etc/GMT
格式的日期。 NodaTime seems to support this when combined with Json.NET and NodaTime.Serialization.JsonNet。我在 Whosebug 上找到了一些信息,这些信息使我能够正常工作,仅使用 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. Value being parsed: '2017-10-26^ 13:32:11 Etc/GMT'. (^ indicates error position.)
。我做错了什么?
目前,您正在创建一个特定的 ZonedDateTime
模式 - 但您实际上并没有在任何地方告诉 Json.NET 该模式。
如果这是您需要使用的 only 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);
}
}