2017-06-07 17 views
1

私はNewtonsoft json.NETを使っていくつかのjsonデータを解析しようとしています。このシリアル化されていないデータにアクセスするにはどうすればよいですか?

データを逆シリアル化できますが、逆シリアル化されたデータを使用しようとすると「 'Newtonsoft.Json.Linq.JArray'に 'leagueName'の定義が含まれていません」というエラーが発生します。

ここで私が使用したいJsonデータです。ここで

[ 
{ 
    "queueType": "RANKED_SOLO_5x5", 
    "hotStreak": false, 
    "wins": 6, 
    "veteran": false, 
    "losses": 10, 
    "playerOrTeamId": "39257940", 
    "tier": "SILVER", 
    "playerOrTeamName": "Kristmas Tree", 
    "inactive": false, 
    "rank": "V", 
    "freshBlood": false, 
    "leagueName": "Fizz's Gladiators", 
    "leaguePoints": 47 
}, 
{ 
    "queueType": "RANKED_FLEX_SR", 
    "hotStreak": true, 
    "wins": 100, 
    "veteran": true, 
    "losses": 99, 
    "playerOrTeamId": "39257940", 
    "tier": "SILVER", 
    "playerOrTeamName": "Kristmas Tree", 
    "inactive": false, 
    "rank": "I", 
    "freshBlood": false, 
    "leagueName": "Xin Zhao's Heralds", 
    "leaguePoints": 57 
} 
] 

は、印刷時の私の試みは、私が非直列化されたデータにアクセスするにはどうすればよい "HotStreakは"

  var json = GetResponse("https://euw1.api.riotgames.com/lol/league/v3/positions/by-summoner/39257940?api_key=xxxx-xxxx-xxxx-xxxxxxxx"); 
      MessageBox.Show(json); // gives me the desired data 

      var summonerInfo = JsonConvert.DeserializeObject<dynamic>(json); 
      var leagueName = summonerInfo.leagueName; 

      MessageBox.Show(leagueName); 

のですか?

+1

[JSONをC#の動的オブジェクトにデシリアライズしますか?](https://stackoverflow.com/questions/3142495/deserialize-json-into-c-sharp-dynamic-object) –

+1

この[回答]強力な型にデシリアライズする必要がある場合は、(https://stackoverflow.com/a/42708158/4228458)を参照してください。 – CodingYoshi

答えて

2

まず、これはを動作することに注意してください:しかし、私はそれをお勧めしません:

var summonerInfo = JsonConvert.DeserializeObject<dynamic>(json); 
foreach(var item in summonerInfo) 
{ 
    Console.WriteLine(item.leagueName); 
} 

はその代わり、私が助言することである:

まず、JSONと一致するタイプを定義します。

class WhateverThisIs // rename me! 
{ 
    public string QueueType { get; set; } 
    public bool HotStreak { get; set; } 
    public int Wins { get; set; } 
    // ... 
    public string LeagueName { get; set; } 
    public int LeagueWins { get; set; } 
} 

は今、そのタイプとしてをデシリアライズ - Jであなたのケースでは、リストや配列に(ルートオブジェクトSONは、JSON配列([...])ではなく、JSONオブジェクト({...}))である:

var summonerInfo = JsonConvert.DeserializeObject<List<WhateverThisIs>>(json); 
foreach(var item in summonerInfo) 
{ 
    Console.WriteLine(item.LeagueName); 
} 

あなたdynamicを使用して物事を行うが、それは単にタイプを定義するよりずっと仕事であることができます。

+0

完璧に感謝します!しかし、私はそれがどのように機能するのか分かりません。この場合summonerInfoはJSONと一致するように作られたクラスのオブジェクトのリストです(この場合Summonerと呼んでいます)? – FastCow

+1

@FastCowおねがいしますか?最初の、または2番目の? 2番目はJSONの形に合ったオブジェクトのリストです。最初はJSON.NETの 'dynamic' APIを使用していますが、これは*働く*だけです*あなたを傷つけるでしょう:*正しい*を得るのはずっと難しく、実行時にははるかに高価です。 –

関連する問題