How can I parse JSON string from HttpClient?

Sonali picture Sonali · Sep 13, 2016 · Viewed 66.8k times · Source

I am getting a JSON result by calling an external API.

        HttpClient client = new HttpClient();
        client.BaseAddress = new Uri(url);
        client.DefaultRequestHeaders.Accept.Add(new MediaTypeWithQualityHeaderValue("application/json"));
        HttpResponseMessage response = client.GetAsync(url).Result;

        if (response.IsSuccessStatusCode)
        {
            var result  = response.Content.ReadAsStringAsync().Result;
            var s = Newtonsoft.Json.JsonConvert.DeserializeObject(result);
            return "Success";
        }
        else
        {
            return "Fail";
        }

The result in line var s = Newtonsoft.Json.JsonConvert.DeserializeObject(result); I am getting is like:

 {{
  "query": "1",
  "topScoringIntent": {
    "intent": "1",
    "score": 0.9978111,
    "actions": [
      {
        "triggered": false,
        "name": "1",
        "parameters": [
          {
            "name": "1",
            "required": true,
            "value": null
          },
          {
            "name": "1",
            "required": true,
            "value": null
          },
          {
            "name": "1",
            "required": true,
            "value": null
          }
        ]
      }
    ]
  },
  "entities": [],
  "dialog": {
    "prompt": "1",
    "parameterName": "1",
    "parameterType": "1::1",
    "contextId": "11",
    "status": "1"
  }
}}

I am using HttpClient. I am facing difficulty in accessing prompt key-value. I want to get prompt from dialog. How can I get it?

Answer

Omar Elabd picture Omar Elabd · Sep 13, 2016

There are three ways that come to mind.

  1. Assuming the json is consistent and the structure of the response will not change frequently, I would use a tool like json2csharp or jsonutils to create c# classes.

    then call:

    {GeneratedClass} obj = JsonConvert.DeserializeObject<{GeneratedClass}>(result);
    

    This will give you a strongly typed object that you can use.

  2. You can skip the class generation and use a dynamic object:

    dynamic obj = JsonConvert.DeserializeObject<dynamic>(result)
    

    and access properties such as:

    obj.dialog.prompt;
    
  3. You can use a JObject and access its properties using strings

    JObject obj = JsonConvert.DeserializeObject(result);
    
    obj["dialog"]["prompt"]