【问题标题】:Calling JObject.Value<string> throws InvalidCastException after upgrading JSON.NET to v10将 JSON.NET 升级到 v10 后调用 JObject.Value<string> 会引发 InvalidCastException
【发布时间】:2017-06-08 23:09:34
【问题描述】:

以下代码在将 JSON.NET 库升级到 v10 后突然抛出错误的原因可能是什么:

var name = json.Value<string>("Name"); // Error: Object must implement IConvertible

如果我将行更改为索引器语法,错误就会消失:

var name = (string)json["Name"];

令人费解的一点是,前一行过去在库的 v6 上可以正常工作,但在升级到 v10 后就失败了。

我还检测到 null 比较的不同行为,我也怀疑这是由升级引起的:

if (json["Name"] != null)
{
    // I find myself in here because JTokenType.Null was unexpectedly returned above.
    // This wasn't the case in v6!
}

Newtonsoft.Json 库的 v6 和 v10 之间是否存在重大变化?如果不是,还有什么可能导致我的问题(尤其是第一个问题)?

【问题讨论】:

  • 当时的值是多少?
  • 您可以在此处查看每个版本的更改:github.com/JamesNK/Newtonsoft.Json/releases
  • @Patrick:我必须复制第一次发现问题时涉及的确切数据集并在调试器下运行它。有问题的值是 System.Guid 类型。这个没有实现 IConvertible,所以除非 JSON.NET v6 对 Guids 做了不同的事情,否则这在以前是行不通的。
  • Json.NET 在版本 5、6 和 7 之间对 GUID 的自动识别做了一些改变;例如见stackoverflow.com/a/30384841/3744182

标签: c# json.net


【解决方案1】:

原来有问题的值是Guid 类型的JToken。我目前无法验证这在 JSON.NET v6 中是否确实有不同的工作方式,但在我看来,JToken.Value&lt;T&gt;() 方法执行到T 的转换与将JToken 实例直接转换为T 不同。我目前也无法判断这是 JSON.NET 中的错误还是只是需要记住的问题。

遗憾的是,我对第二个问题的解释还不够深入,因为我还没有可重现的案例。

【讨论】:

    猜你喜欢
    • 2018-01-30
    • 2022-01-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-02-28
    • 1970-01-01
    相关资源
    最近更新 更多