web-dev-qa-db-fra.com

Comment puis-je analyser json string à partir de Httpclient

Salut, je reçois résultat json en appelant une api externe.

        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";
        }

le résultat dans la ligne var s = Newtonsoft.Json.JsonConvert.DeserializeObject(result); que je reçois est comme:

 {{
  "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"
  }
}}

comment puis-je obtenir Prompt de 'dialogue'? J'utilise le client http. J'ai du mal à accéder à la valeur-clé de l'invite. Je veux obtenir une invite de dialogue. comment puis-je l'avoir?

16
Sonali

Vous voulez jeter un oeil ici: http://www.newtonsoft.com/json/help/html/deserializeobject.htm

Créez une classe avec la même structure que votre XML. Ensuite, votre variable s est une instance de cette classe et vous pouvez désérialiser le json dans la structure de la classe.

Dans votre cas, votre propriété devrait être s.dialog.Prompt.

9
c0d3b34n

Il y a trois façons qui me viennent à l’esprit.

  1. En supposant que le json soit cohérent et que la structure de la réponse ne change pas souvent, j'utiliserais un outil tel que json2csharp ou jsonutils pour créer des classes c #.

    puis appelez:

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

    Cela vous donnera un objet fortement typé que vous pouvez utiliser.

  2. Vous pouvez ignorer la génération de classe et utiliser un objet dynamique:

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

    et accéder à des propriétés telles que:

    obj.dialog.Prompt;
    
  3. Vous pouvez utiliser un objet JObject et accéder à ses propriétés à l'aide de chaînes

    JObject obj = JsonConvert.DeserializeObject(result);
    
    obj["dialog"]["Prompt"]
    
24
Omar Elabd

Édité:

Importer Newtonsoft.Json

JObject s = JObject.Parse(result);
string yourPrompt = (string)s["dialog"]["Prompt"];
11
cemsina güzel

Avec:

using Newtonsoft.Json;

vous pouvez sauvegarder une étape en lisant directement le contenu en tant que JObject:

dynamic response = await response.Content.ReadAsAsync<JObject>();
string Prompt = response.dialog.Prompt.ToString();

Remarque: Cela nécessite que le contenu de la réponse soit de type de contenu "application/json".

0
DSpirit