【发布时间】:2017-11-15 15:22:40
【问题描述】:
我正在尝试反序列化一个 JSON,其中包含 2017-10-26 13:32:11 Etc/GMT 格式的日期。 NodaTime 与 Json.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. Value being parsed: '2017-10-26^ 13:32:11 Etc/GMT'. (^ indicates error position.) 引发异常。我做错了什么?
【问题讨论】:
-
你必须使用
DateTimeOffset而不是野田时间OffsetDateTime类型吗?一般来说,如果你能完全坚持 Noda Time 类型,生活会更简单。 -
不,我可以使用任何类型,但没有太大区别,我只是得到另一个错误;
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.)。尝试了几种不同的模式变体,没有'等,并尝试了几种不同的类型,OffsetDateTime和ZonedDateTime,但错误仍然相同。 -
如果您愿意将值设为
ZonedDateTime,您应该可以让它工作。 (当我建议OffsetDateTime时,我没有发现实际上您的值包含时区,而不是偏移量。)目前,问题不在于这种方法 - 删除您当前的答案和将问题更改为“让 NodaTime.Serialization.JsonNet 使用自定义格式”或为此创建一个新问题。不管怎样,我绝对想提供帮助...... -
问题已更新:)
-
太好了,谢谢。现在将开始工作。
标签: c# json json.net deserialization nodatime