[SOLVED] Parsing Dynamic JSON in C#

Issue

I am working with an API that uses GraphQL and returns JSON data and I want to deserialize the JSON content dynamically rather than map the entire service structure in my application into C# data structures (.NET types/classes).

I’ve done this before but the JSON data was quite simple and straightforward. However, the this API I’m working with returns more complex/verbose JSON and I’m struggling to parse it properly.

Can anyone advise on how to parse the below JSON? That is, how to access the dynamic JSON’s objects/properties.

I’m using Newtonsoft.Json. This is my code to deserialize:

byte bC = 0;
string location_text = string.Empty;
string location_value = string.Empty;
dynamic results = JsonConvert.DeserializeObject<dynamic>(json);
foreach (dynamic d in results)
{
   bC = d.data.locationSuggestions.Count; // d.locationSuggestions.Count
   for (byte b = 0; b < bC; b++)
   {
       location_text = d.data.locationSuggestions[b].location.contextualName;
       location_value = d.data.locationSuggestions[b].location.id.value;
   }
}

When I run this code I get an error that says "data" or "locationSuggestions" cannot be found.

The JSON I’m trying to parse is as follows:

{
  "data": {
    "locationSuggestions": [
      {
        "location": {
          "id": {
            "value": "seekAnzPublicTest:location:seek:2dkY4vZJF"
          },
          "name": "Brisbane",
          "contextualName": "Brisbane QLD 4000 AU",
          "countryCode": "AU",
          "parent": {
            "id": {
              "value": "seekAnzPublicTest:location:seek:2FjxhQans"
            },
            "name": "CBD & Inner Suburbs",
            "parent": {
              "id": {
                "value": "seekAnzPublicTest:location:seek:32XZdsa2K"
              },
              "name": "Brisbane"
            }
          }
        }
      },
      {
        "location": {
          "id": {
            "value": "seekAnzPublicTest:location:seek:2ckmimaF1"
          },
          "name": "Brisbane Grove",
          "contextualName": "Brisbane Grove NSW 2580 AU",
          "countryCode": "AU",
          "parent": {
            "id": {
              "value": "seekAnzPublicTest:location:seek:2UC23LszP"
            },
            "name": "Southern Highlands & Tablelands",
            "parent": {
              "id": {
                "value": "seekAnzPublicTest:location:seek:FTwZdE2K"
              },
              "name": "New South Wales"
            }
          }
        }
      }
    ]
  },
  "extensions": {
    "requestLatency": 171
  }
}

Solution

Regarding your JSON string, you can use dynamic to parse it and access the data as shown below:

You can also find a working example at: https://dotnetfiddle.net/lnhwJz

using System;
using Newtonsoft.Json;

                    
public class Program
{
    public static void Main()
    {
        var [email protected]"{'data':{'locationSuggestions':[{'location':{'id':{'value':'seekAnzPublicTest:location:seek:2dkY4vZJF'},'name':'Brisbane','contextualName':'Brisbane QLD 4000 AU','countryCode':'AU','parent':{'id':{'value':'seekAnzPublicTest:location:seek:2FjxhQans'},'name':'CBD & Inner Suburbs','parent':{'id':{'value':'seekAnzPublicTest:location:seek:32XZdsa2K'},'name':'Brisbane'}}}},{'location':{'id':{'value':'seekAnzPublicTest:location:seek:2ckmimaF1'},'name':'Brisbane Grove','contextualName':'Brisbane Grove NSW 2580 AU','countryCode':'AU','parent':{'id':{'value':'seekAnzPublicTest:location:seek:2UC23LszP'},'name':'Southern Highlands & Tablelands','parent':{'id':{'value':'seekAnzPublicTest:location:seek:FTwZdE2K'},'name':'New South Wales'}}}}]},'extensions':{'requestLatency':171}}";
        var parsedData=JsonConvert.DeserializeObject<dynamic>(jsonString);
        
        foreach(var item in parsedData.data.locationSuggestions)
        {
          Console.WriteLine(item.location.name);          
          Console.WriteLine(item.location.id.value);
          Console.WriteLine(item.location.contextualName);
        }
    }
}

Output:

Brisbane 
seekAnzPublicTest:location:seek:2dkY4vZJF 
Brisbane QLD 4000 AU 
Brisbane Grove 
seekAnzPublicTest:location:seek:2ckmimaF1 
Brisbane Grove NSW 2580 AU

Answered By – Rahul Sharma

Answer Checked By – Marilyn (BugsFixing Volunteer)

Leave a Reply

Your email address will not be published. Required fields are marked *