【发布时间】:2015-02-27 15:28:43
【问题描述】:
我在使用 JToken 反序列化 NodaTime.Instant 时遇到了麻烦。 使用 JsonConvert.DeserializeObject 时,问题不会出现。
以下示例代码失败并出现异常:
let jsonOptions =
let n = new JsonSerializerSettings()
n.ConfigureForNodaTime(NodaTime.DateTimeZoneProviders.Tzdb)
JToken.Parse("\"2010-02-12T23:22:00Z\"")
.ToObject<Instant>(JsonSerializer.Create(jsonOptions));
异常的堆栈跟踪是:
deserialisation/deserialisation with JToken: Exception: NodaTime.Utility.InvalidNodaDataException: Unexpected token parsing Instant. Expected String, got Date.
at NodaTime.Serialization.JsonNet.NodaPatternConverter`1.ReadJsonImpl(JsonReader reader, JsonSerializer serializer)
at NodaTime.Serialization.JsonNet.NodaConverterBase`1.ReadJson(JsonReader reader, Type objectType, Object existingValue, JsonSerializer serializer)
at Newtonsoft.Json.Serialization.JsonSerializerInternalReader.DeserializeConvertable(JsonConverter converter, JsonReader reader, Type objectType, Object existingValue)
at Newtonsoft.Json.Serialization.JsonSerializerInternalReader.Deserialize(JsonReader reader, Type objectType, Boolean checkAdditionalContent)
at Newtonsoft.Json.JsonSerializer.DeserializeInternal(JsonReader reader, Type objectType)
at Newtonsoft.Json.Linq.JToken.ToObject(Type objectType, JsonSerializer jsonSerializer)
at Newtonsoft.Json.Linq.JToken.ToObject[T](JsonSerializer jsonSerializer)
使用JsonConvert.DeserializeObject 反序列化相同的字符串是可行的。
JsonConvert.DeserializeObject<Instant>("\"2010-02-12T23:22:00Z\"", jsonOptions)
可在此处找到 2 个测试:
关于导致异常的原因有什么想法吗?
【问题讨论】:
-
对于 StackOverflow,您需要复制代码的违规部分、预期输入和实际输出。这些应该是问题,作为一个最小可行的例子。要点链接可以保留,但应该是次要的。请编辑问题。谢谢。
-
感谢@olav 的编辑!
标签: json f# json.net deserialization nodatime