2017-11-01 3 views
-3

Ich versuche, ein bestimmtes Teil von einer JSON-Antwort-Zeichenfolge zu erhalten. HierC# Parse JSON-Antwort (Get ein bestimmtes Teil von Antwort)

ist der JSON-Code:

{ 
    "metadata": { 
    "provider": "Oxford University Press" 
    }, 
    "results": [ 
    { 
     "id": "door", 
     "language": "en", 
     "lexicalEntries": [ 
     { 
      "entries": [ 
      { 
       "homographNumber": "000", 
       "senses": [ 
       { 
        "definitions": [ 
        "a hinged, sliding, or revolving barrier at the entrance to a building, room, or vehicle, or in the framework of a cupboard" 
        ], 
        "id": "m_en_gbus0290920.005", 
        "subsenses": [ 
        { 
         "definitions": [ 
         "a doorway" 
         ], 
         "id": "m_en_gbus0290920.008" 
        }, 
        { 
         "definitions": [ 
         "used to refer to the distance from one building in a row to another" 
         ], 
         "id": "m_en_gbus0290920.009" 
        } 
        ] 
       } 
       ] 
      } 
      ], 
      "language": "en", 
      "lexicalCategory": "Noun", 
      "text": "door" 
     } 
     ], 
     "type": "headword", 
     "word": "door" 
    } 
    ] 
} 

Ich versuche, diesen Code zu bekommen

"Definitionen": [ „eine klappbare, Schiebe- oder Drehschranke am Eingang eines Gebäude, Raum oder Fahrzeug oder im Rahmen eines Schranks“

in einem String Hier ist mein Code:

string language = "en"; 
      string word_id = textBox1.Text.ToLower(); 

      String url = "https://od-api.oxforddictionaries.com:443/api/v1/entries/" + language + "/" + word_id+"/definitions"; 

      HttpClient client = new HttpClient(); 

      client.BaseAddress = new Uri(url); 
      client.DefaultRequestHeaders.Add("app_id", app_Id); 
      client.DefaultRequestHeaders.Add("app_key", app_Key); 

      HttpResponseMessage response = client.GetAsync(url).Result; 
      if (response.IsSuccessStatusCode) 
      { 
       var result = response.Content.ReadAsStringAsync().Result; 
       var s = JsonConvert.DeserializeObject(result); 

       textBox2.Text = s.ToString(); 

      } 
      else MessageBox.Show(response.ToString()); 

Ich verwende C#.

+4

'Ich bin mit C# .' es beweisen - zeigen uns den Code, den Sie verwenden, wie es ausfällt und Was das Problem ist. Lesen Sie [fragen] und nehmen Sie die [Tour] – Plutonix

+0

https://hastebin.com/ukeqemibiv.cs –

+1

Bitte bearbeiten Sie Ihre Frage, um Ihre Bemühungen zu zeigen. Ich möchte nicht 3 Tabs öffnen müssen, um Ihre Frage in ihrer Gesamtheit zu betrachten. –

Antwort

3

C# Klassen

Schritt eins ist, einige Klassen zu erstellen, damit wir die Daten in C# repräsentieren. Wenn Sie sie nicht haben ... QuickType does that.

namespace QuickType 
{ 
    using System; 
    using System.Net; 
    using System.Collections.Generic; 

    using Newtonsoft.Json; 

    public partial class GettingStarted 
    { 
     [JsonProperty("metadata")] 
     public Metadata Metadata { get; set; } 

     [JsonProperty("results")] 
     public Result[] Results { get; set; } 
    } 

    public partial class Result 
    { 
     [JsonProperty("id")] 
     public string Id { get; set; } 

     [JsonProperty("language")] 
     public string Language { get; set; } 

     [JsonProperty("lexicalEntries")] 
     public LexicalEntry[] LexicalEntries { get; set; } 

     [JsonProperty("type")] 
     public string Type { get; set; } 

     [JsonProperty("word")] 
     public string Word { get; set; } 
    } 

    public partial class LexicalEntry 
    { 
     [JsonProperty("entries")] 
     public Entry[] Entries { get; set; } 

     [JsonProperty("language")] 
     public string Language { get; set; } 

     [JsonProperty("lexicalCategory")] 
     public string LexicalCategory { get; set; } 

     [JsonProperty("text")] 
     public string Text { get; set; } 
    } 

    public partial class Entry 
    { 
     [JsonProperty("homographNumber")] 
     public string HomographNumber { get; set; } 

     [JsonProperty("senses")] 
     public Sense[] Senses { get; set; } 
    } 

    public partial class Sense 
    { 
     [JsonProperty("definitions")] 
     public string[] Definitions { get; set; } 

     [JsonProperty("id")] 
     public string Id { get; set; } 

     [JsonProperty("subsenses")] 
     public Subsense[] Subsenses { get; set; } 
    } 

    public partial class Subsense 
    { 
     [JsonProperty("definitions")] 
     public string[] Definitions { get; set; } 

     [JsonProperty("id")] 
     public string Id { get; set; } 
    } 

    public partial class Metadata 
    { 
     [JsonProperty("provider")] 
     public string Provider { get; set; } 
    } 

    public partial class GettingStarted 
    { 
     public static GettingStarted FromJson(string json) => JsonConvert.DeserializeObject<GettingStarted>(json, Converter.Settings); 
    } 

    public static class Serialize 
    { 
     public static string ToJson(this GettingStarted self) => JsonConvert.SerializeObject(self, Converter.Settings); 
    } 

    public class Converter 
    { 
     public static readonly JsonSerializerSettings Settings = new JsonSerializerSettings 
     { 
      MetadataPropertyHandling = MetadataPropertyHandling.Ignore, 
      DateParseHandling = DateParseHandling.None, 
     }; 
    } 
} 

Deserialize

Sie werden bemerken, dass wir auch Wandler haben zu serialisiert und deserialisiert für uns erzeugt. Das deserialize Bit ist so einfach wie:

var result = JsonConvert.DeserializeObject<GettingStarted>(json); 

Verwenden

Start aus den result Variable und Verwendung Punkten Ihren Weg nach unten zu Ihrem Artikel finden ...

var description = result.results.lexicalEntries.First() 
    .entries.First() 
    .senses.First() 
    .definitions.First(); 

die Alle First() Aufrufe sind aufgrund jedes dieser Teile der Daten, die Arrays sind. Sie müssen dazu auf System.Linq verweisen. Sie sollten etwas darüber lesen, was zu tun ist, wenn Sie mehr als ein oder weniger als eins auf einer dieser Ebenen haben (Sie müssen möglicherweise mit Sammlungen arbeiten oder mehr Traversierungen durchführen).

0

Sie können eine Klasse erstellen, deren Eigenschaften die Namen der JSON sind, die Sie analysieren möchten. Auf diese Weise können Sie das JSON in eine Instanz dieser Klasse deserialisieren und die gewünschte Eigenschaft abrufen. Sie müssen das Newtonsoft.Json-Paket verwenden.

Beispiel Klasse:

public class YourClass 
{ 
    public string propertyA { get; set; } 
    public string propertyB { get; set; } 
} 

Und dann in der Hauptcode:

YourClass yourClass = new YourClass(); 
try 
{ 
    yourClass = JsonConvert.DeserializeObject<YourClass>(yourJsonStringGoesHere); 
} 
catch (Exception ex) 
{ 
     //log exception here 
}