2016-11-24 106 views
2

我試圖尋找此JSON代碼找到統計:解析數據

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

在下面的例子,我想成爲totalSessionsWon能夠搜索ID 36.我試着訪問數據如何我已經從其他JSON文件訪問數據,但它不允許我指定的冠軍,我搜索的ID:

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

有沒有辦法,我可以選擇基於特定的統計信息的方式在它之前的id?

我是新來使用JSON和C#,所以你的幫助特別感謝!

+3

你不能擺動一個死亡的負鼠在這裏沒有擊中JSON的問題。閱讀其中的一些內容,試試看,並在卡住時發佈實際問題 – Plutonix

+0

JSON的結構看起來很好。看起來您需要了解有關JSON的更多信息以及如何使用C#讀取/寫入它。如果您在網絡上搜索該主題,可以找到關於該主題的大量教程。如果你只是在尋找教程,他們是關於堆棧溢出[關閉主題](http://stackoverflow.com/help/on-topic)。但是,如果您發佈當前嘗試的代碼,那麼我們可以幫助您找出所需數據出錯的位置。 – Adrian

+1

@Plutonix那個負鼠對你做了什麼? –

回答

3

如果Newtonsoft.Json;對你來說比你現在看到的如何install Newtonsoft現在一旦安裝完成,我很想告訴你,XML,JSON是一種開放標準格式,使用人類可讀的文本來傳輸數據對象由屬性值對組成。從這種字符串中獲取數據將像數據庫一樣簡單。

對於從json字符串輕鬆獲取數據首先我們需要使顯示jira字符串的json字符串的對象成爲可能,因此我們需要查看數據或json字符串的外觀。所以,如果你看到的層次結構的最頂層包含summonerIdmodifyDatechampionschampions有可能是n數量的冠軍詳細信息,以便我們創造冠軍的列表作爲champions

現在的層次結構的下一層,你可以看到冠軍ID和他的統計數據,所以統計數據將成爲關於冠軍的另一個類別。所以您的類看起來像

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

現在,因爲我們已經得到了我們需要反序列化串到我們的類型的對象,它是Rootobject結構。這將轉換該普通的json字符串來填充對象。現在只需獲取細節,如吃蛋糕。

using Newtonsoft.Json; 

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

考慮到這個問題的作者是JSON和C#的新手,最好包含一些關於這個代碼的解釋解決了用戶需要的而不僅僅是提供解決方案。 (換句話說,解釋代碼中發生了什麼) – Adrian

+1

希望@Adrian這個解釋就夠了。 :) –

+0

是的,我認爲你已經做了一個體面的嘗試來解釋如何解決這個問題。 – Adrian

2

隨着問題的作者試圖用JObject來查詢自己的JSON對象,我想我會給使用相同的解決方案。

JObject用於查詢與Linq的JSON。對於新C#程序員來說,Linq是一個半高級主題,可以讓他們輕鬆掌握,但簡而言之,它是一種用於從數據源檢索數據的專用查詢語言。 Mohit Shrivastrava的回答中概述的方法對新程序員來說很容易。

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