JToken不像JsonConvert.DeserializeObject那样取消序列化



我在取消NodaTime.Inter与JToken的序列化时遇到了问题。使用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

关于是什么导致了异常,有什么想法吗?

JToken.Parse内部使用JSonTextReader来解析字符串。JSonTextReader的默认行为是将示例中的时间日期字符串解析为DateTimeNodaPatternConverter需要string,而不是DateTime。您可以使用JToken.Load方法,并传递一个将DateParseHandling设置为DateParseHandling.NoneJSonTextReader

当您使用JsonConvert.DeserializeObject时,它将使用您在jsonOptions中创建的JsonSerializerSettingsConfigureForNodaTime方法将DateParseHandling属性设置为DateParseHandling.None,这就是为什么当您传递所做的设置时JsonConvert.DeserializeObject会起作用。

相关内容

  • 没有找到相关文章

最新更新