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

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

1 Answer

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); } } 
1

Your Answer

Sign up or log in

Sign up using Google Sign up using Facebook Sign up using Email and Password

Post as a guest

By clicking “Post Your Answer”, you agree to our terms of service, privacy policy and cookie policy

You Might Also Like