从 JSON 检索项目时获取“无法将 Newtonsoft.Json.Linq.JObject 转换为 Newtonsoft.Json.Linq.JToken”

Posted

技术标签:

【中文标题】从 JSON 检索项目时获取“无法将 Newtonsoft.Json.Linq.JObject 转换为 Newtonsoft.Json.Linq.JToken”【英文标题】:Getting 'Cannot cast Newtonsoft.Json.Linq.JObject to Newtonsoft.Json.Linq.JToken' when retrieving items from JSON 【发布时间】:2018-09-11 17:03:14 【问题描述】:

当有以下代码时

var TermSource =
token.Value<JArray>("annotations")
     .Values<string>("Term Source")
     .FirstOrDefault();

我能够得到以下 JSON 块的结果

"annotations": [
  
     "Preferred Term": "Text1"
  ,
  
     "Term Source": "Text2"
  
],

但是,当运行以下行时

var country_code_iso3166_alpha2 =
    token.Value<JArray>("datatype_properties")
         .Values<string>("country_code_iso3166_alpha2")
         .FirstOrDefault();

对于以下 JSON 块

"datatype_properties": 
  "country_name_iso3166_short": [
    "Text Text"
  ],
  "country_code_iso3166_alpha2": [
    "txt1"
  ],
  "country_code_iso3166_alpha3": [
    "txt2"
  ],
  "country_code_un_numeric3": [
    "10"
  ]

我收到以下错误

'无法将 Newtonsoft.Json.Linq.JObject 转换为 Newtonsoft.Json.Linq.JToken'

我应该如何修复 LINQ 语句以检索“country_code_iso3166_alpha2”数据的值

【问题讨论】:

【参考方案1】:

您正在尝试访问datatype_properties,就好像它是一个数组一样。不是 - 它是另一个具有属性 country_code_iso3166_alpha3 的对象,该属性具有数组值。

您可以使用JObject 类型参数调用Value 方法来获取对象,然后再次使用JArray 类型参数调用Value 来获取数组。这是一个简短但完整的示例:

using System;
using System.Linq;
using Newtonsoft.Json.Linq;

class Test

    static void Main()
    
        string json = @"
  'datatype_properties': 
    'country_name_iso3166_short': [
      'Text Text'
    ]
  
".Replace("'", "\"");
        JObject parent = JObject.Parse(json);
        string countryName = parent["datatype_properties"]
            .Value<JArray>("country_name_iso3166_short")
            .Values<string>()
            .FirstOrDefault();
        Console.WriteLine(countryName);
    

【讨论】:

非常感谢您的帮助,先生!

以上是关于从 JSON 检索项目时获取“无法将 Newtonsoft.Json.Linq.JObject 转换为 Newtonsoft.Json.Linq.JToken”的主要内容,如果未能解决你的问题,请参考以下文章

如何从 Firebase 实时数据库中检索/获取项目

从 Javascript 获取 JSON 数据

从嵌套的 JSON 中检索数据

从服务器检索数据太慢

如何在 Vue 中使用 axios 检索 JSON Web 令牌?

从 mysql 检索 json 数据并获取值作为对象