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

标签 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

关于导致异常的原因有什么想法吗?

最佳答案

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

JSonTextReader

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

关于json - JToken 不像 JsonConvert.DeserializeObject 那样反序列化,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28768607/

相关文章:

json - 有没有办法将 package.json 文件中的依赖项安装到不同的目录中?

javascript - 从分割的字符串创建对象

json - 如何在openAPI JSON中指定名称不是静态的 key

f# - 修改 StringFormat 的函数

serialization - 默认合约解析器 : CreateContract vs ResolveContract

python - 从多个字典写入单个 JSON

f# - F# 的 LP DSL,以 Clp 作为求解器

f# - 如何访问受歧视联合元组中的项目?

c# - JSON.Net 序列化集合到数组的数组

json - 如何使用 json.net 将额外的属性添加到序列化的 JSON 字符串中?