2016-11-24 1 views
2

ich diesen Json-Code zu suchen, ich versuche, Statistiken zu finden:Parse Daten aus mehreren json-Arrays in C#

{ 
    "summonerId": 32033681, 
    "modifyDate": 1403658807000, 
    "champions": [{ 
     "id": 40, 
     "stats": { 
      "totalSessionsPlayed": 1, 
      "totalSessionsLost": 0, 
      "totalSessionsWon": 1, 
      "totalChampionKills": 1, 
      "totalDamageDealt": 27006, 
      "totalDamageTaken": 9924, 
      "mostChampionKillsPerSession": 1, 
      "totalMinionKills": 17, 
      "totalDoubleKills": 0, 
      "totalTripleKills": 0, 
      "totalQuadraKills": 0, 
      "totalPentaKills": 0, 
      "totalUnrealKills": 0, 
      "totalDeathsPerSession": 2, 
      "totalGoldEarned": 8383, 
      "mostSpellsCast": 0, 
      "totalTurretsKilled": 2, 
      "totalPhysicalDamageDealt": 8957, 
      "totalMagicDamageDealt": 18049, 
      "totalFirstBlood": 0, 
      "totalAssists": 13, 
      "maxChampionsKilled": 1, 
      "maxNumDeaths": 2 
     } 
    }, 
    { 
     "id": 36, 
     "stats": { 
      "totalSessionsPlayed": 1, 
      "totalSessionsLost": 1, 
      "totalSessionsWon": 0, 
      "totalChampionKills": 0, 
      "totalDamageDealt": 14267, 
      "totalDamageTaken": 7649, 
      "mostChampionKillsPerSession": 0, 
      "totalMinionKills": 33, 
      "totalDoubleKills": 0, 
      "totalTripleKills": 0, 
      "totalQuadraKills": 0, 
      "totalPentaKills": 0, 
      "totalUnrealKills": 0, 
      "totalDeathsPerSession": 5, 
      "totalGoldEarned": 3258, 
      "mostSpellsCast": 0, 
      "totalTurretsKilled": 0, 
      "totalPhysicalDamageDealt": 4992, 
      "totalMagicDamageDealt": 9165, 
      "totalFirstBlood": 0, 
      "totalAssists": 0, 
      "maxChampionsKilled": 0, 
      "maxNumDeaths": 5 
     } 
    }] 
} 

Im folgenden Beispiel möchte ich für totalSessionsWon Lage Suche sein für id 36. Ich habe versucht, den Zugriff auf die Daten, wie ich Daten aus anderen JSON-Dateien wurden zugreifen, aber es erlaubt mir nicht, die ID des Champion angeben ich suche:

string jsonInput = new WebClient().DownloadString(@usableurl); //Reads the JSON from the API 
string usableJson = @"JObject.Parse(jsonInput)"; //converts the JSON from the API to a usable form 
var usableJson["champions"]["stats"]["totalSessionWon"]; 

gibt es eine Möglichkeit, dass ich eine bestimmte Statistik wählen könnte basierend auf der ID davor?

Ich bin neu in der Verwendung von JSON und C#, so dass Ihre Hilfe besonders geschätzt wird!

+3

Sie können hier ein totes Opossum schwingen, ohne eine JSON-Frage zu beantworten. Lies einige davon, probiere es aus und poste eine aktuelle Frage, wenn du nicht weiterkommst – Plutonix

+0

Die Struktur deines JSON sieht gut aus. Es sieht so aus, als müssten Sie mehr über JSON und das Lesen/Schreiben mit C# lernen. Es gibt viele Tutorials zu diesem Thema, wenn Sie im Internet danach suchen. Wenn Sie nur nach Tutorials suchen, sind sie [off topic] (http://stackoverflow.com/help/on-topic) auf Stack Overflow. Wenn Sie jedoch den Code Ihres aktuellen Versuchs veröffentlichen, können wir Ihnen helfen, auf die gewünschten Daten zuzugreifen. – Adrian

+1

@Plutonix Was hat dir dieses Opossum jemals angetan? –

Antwort

3

Wenn Newtonsoft.Json; für Sie neu ist, können Sie einen Blick darauf werfen, wie install Newtonsoft jetzt, sobald die Installation fertig ist, würde ich lieben, Ihnen zu sagen, dass XML, JSON ein offenes Standardformat sind, das von Menschen lesbare Texte verwendet Datenobjekte, die aus Attribut-Wert-Paaren bestehen. Das Abrufen der Daten von dieser Art von Zeichenfolgen wäre so einfach wie die Datenbank.

Um die Daten aus der JSON-Zeichenkette einfach abrufen zu können, müssen wir zunächst das Objekt der JSON-Zeichenkette erstellen, das die Hierarchie anzeigt. Daher müssen wir sehen, wie unsere Daten oder JSON-Zeichenketten aussehen. Also, wenn Sie die oberste Ebene der Hierarchie sehen enthält summonerId, modifyDate und champions Innen champions könnte es n Anzahl von Champion Details sein, damit wir die Liste des Meisters als champions

nun eine Ebene tiefer der Hierarchie erstellt wird, können Sie sehen, Die Champion-ID und seine Statistiken wären eine weitere Klasse, die man über den Champion erstellen könnte. so würde die Klasse aussehen

public class Rootobject 
{ 
    public int summonerId { get; set; } 
    public long modifyDate { get; set; } 
    public List<Champion> champions { get; set; } 
} 

public class Champion 
{ 
    public int id { get; set; } 
    public Stats stats { get; set; } 
} 

public class Stats 
{ 
    public int totalSessionsPlayed { get; set; } 
    public int totalSessionsLost { get; set; } 
    public int totalSessionsWon { get; set; } 
    public int totalChampionKills { get; set; } 
    public int totalDamageDealt { get; set; } 
    public int totalDamageTaken { get; set; } 
    public int mostChampionKillsPerSession { get; set; } 
    public int totalMinionKills { get; set; } 
    public int totalDoubleKills { get; set; } 
    public int totalTripleKills { get; set; } 
    public int totalQuadraKills { get; set; } 
    public int totalPentaKills { get; set; } 
    public int totalUnrealKills { get; set; } 
    public int totalDeathsPerSession { get; set; } 
    public int totalGoldEarned { get; set; } 
    public int mostSpellsCast { get; set; } 
    public int totalTurretsKilled { get; set; } 
    public int totalPhysicalDamageDealt { get; set; } 
    public int totalMagicDamageDealt { get; set; } 
    public int totalFirstBlood { get; set; } 
    public int totalAssists { get; set; } 
    public int maxChampionsKilled { get; set; } 
    public int maxNumDeaths { get; set; } 
} 

Jetzt, da wir bereits die Struktur haben wir zu Deserialize die Zeichenfolge auf das Objekt unserer Art benötigen, die RootObject ist. Dadurch wird diese normale JSON-Zeichenfolge konvertiert, um die Objekte auszufüllen. Jetzt holen Sie einfach die Details wie einen Kuchen essen.

using Newtonsoft.Json; 

Rootobject rt = JsonConvert.DeserializeObject<Rootobject>(jsonstr); 
if(rt.champions[1].id == 36) 
{ 
    Console.WriteLine(rt.champions[1].stats.totalSessionsWon); 
} 
+0

In Anbetracht der Autor der Frage ist neu in JSON und C#, könnte es besser sein, einige Erklärungen, wie dieser Code löst, was der Benutzer will, anstatt nur die Lösung zu liefern. (Mit anderen Worten erklären, was im Code passiert) – Adrian

+1

Hope @Adrian diese Erklärung ist genug. :) –

+0

Ja, ich denke, Sie haben einen anständigen Versuch unternommen zu erklären, wie dies die Frage löst. – Adrian

2

Wie der Autor der Frage JObject zu verwenden, wurde versucht, ihre JSON-Objekt abzufragen, ich dachte, ich würde eine Lösung geben, die diese verwendet.

JObject ist für die Abfrage von JSON mit Linq. Linq ist ein fortgeschrittenes Thema für neue C# -Programmierer, aber es ist eine spezialisierte Abfragesprache zum Abrufen von Daten aus einer Datenquelle. Die Methode, die in Mohit Shrivastravas Antwort beschrieben wird, ist für neue Programmierer viel leichter zu verstehen.

//converts the JSON from the API to a usable form 
JObject usableJson = JObject.Parse(json); 

// retrieve champion objects 
JToken champions = usableJson["champions"]; 

// retrieve the champion desired object using the Linq FirstOrDefault method. 
// This method will return the first object that matches the given query, 
// or return null if it does not find a match. 
JToken champion = champions.FirstOrDefault(c=> (int)c["id"] == 36); 

if (champion != null) 
{ 
    // retrieve the stats object 
    JToken stats = champion["stats"]; 

    // read the totalSessionsWon field from the object. 
    int totalSessionsWon = (int) stats["totalSessionsWon"]; 
}