Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Getting 'Cannot cast Newtonsoft.Json.Linq.JObject to Newtonsoft.Json.Linq.JToken' when retrieving items from JSON

Tags:

json

c#

linq

When having the following code

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

I am able to get results for the following JSON block

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

However, when running the following line

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

for the following JSON block

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

I get the following error

'Cannot cast Newtonsoft.Json.Linq.JObject to Newtonsoft.Json.Linq.JToken'

How I should fix the LINQ statement to retrieve the value for the 'country_code_iso3166_alpha2' data

like image 986
James Avatar asked Mar 07 '23 12:03

James


1 Answers

You're trying to access datatype_properties as if it's an array. It's not - it's another object with a property country_code_iso3166_alpha3 which has an array value.

You can call the Value method with a JObject type argument to get the object, then Value again with a JArray type argument to get the array. Here's a short but complete example:

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);
    }
}
like image 174
Jon Skeet Avatar answered Mar 10 '23 13:03

Jon Skeet