JToken不像JsonConvert.DeserializeObject那样反序列化

时间:2015-02-27 15:28:43

标签: json f# json.net deserialization nodatime

我遇到麻烦用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个测试:

Tests.fsx

有关导致异常的原因的任何想法?

1 个答案:

答案 0 :(得分:3)

JToken.Parse在内部使用JSonTextReader来解析字符串。 JSonTextReader的默认行为是将样本中的时间字符串解析为DateTimeNodaPatternConverter需要string,而不是DateTime。 您可以使用JToken.Load方法,然后传递将DateParseHandling设置为JSonTextReader的{​​{1}}

当您使用DateParseHandling.None时,请使用您在JsonConvert.DeserializeObject中创建的JsonSerializerSettingsjsonOptions方法将ConfigureForNodaTime属性设置为DateParseHandling,这就是当您传递设置时DateParseHandling.None工作的原因。