2016-12-19 8 views
1

基本的にどこでも検索されていますので、私の状況で動作するものは見つかりません。JSON C#のDataTableオブジェクトへの文字列

私はOverwatch(ゲーム)のAPIを使用しています。ウェブからダウンロードしたStringを回して、JSON文字列があるかどうかを確認したいと思います。

{"data":{"username":"Rezoh","level":305,"games":{"quick":{"wins":"378"},"competitive":{"wins":"82","lost":85,"played":"167"}},"playtime":{"quick":"88 hours","competitive":"36 hours"},"avatar":"https://blzgdapipro-a.akamaihd.net/game/unlocks/0x0250000000000D70.png","competitive":{"rank":"3392","rank_img":"https://blzgdapipro-a.akamaihd.net/game/rank-icons/season-2/rank-5.png"},"levelFrame":"https://blzgdapipro-a.akamaihd.net/game/playerlevelrewards/0x025000000000092D_Border.png","star":"https://blzgdapipro-a.akamaihd.net/game/playerlevelrewards/0x025000000000092D_Rank.png"}} 

は今、私はいくつかのテーブルにそれを変換する必要があります。ですから、例えば出力、この場合には、wouldv'eれて

< !--language: c# --> 
       HttpClient dc = new HttpClient(); 
       string tag = e.Message.Text.ToString().Substring(7).Replace("#", "-"); 
       string apiurl = (@"http://api.lootbox.eu/" + "pc/" + "global/" + tag + "/profile"); 
       HttpResponseMessage datares = await dc.GetAsync(apiurl); 
       string finaldata = await datares.Content.ReadAsStringAsync(); 
       #region PC 
       if (finaldata.Contains(":404")) 
       { 
        apiurl = (@"http://api.lootbox.eu/" + "pc/" + "us/" + tag + "/profile"); 
        datares = await dc.GetAsync(apiurl); 
        finaldata = await datares.Content.ReadAsStringAsync(); 

       } 
       else if (finaldata.Contains(":404")) 
       { 
        apiurl = (@"http://api.lootbox.eu/" + "pc/" + "kr/" + tag + "/profile"); 
        datares = await dc.GetAsync(apiurl); 
        finaldata = await datares.Content.ReadAsStringAsync(); 
       } 
       else if (finaldata.Contains(":404")) 
       { 
        apiurl = (@"http://api.lootbox.eu/" + "pc/" + "eu/" + tag + "/profile"); 
        datares = await dc.GetAsync(apiurl); 
        finaldata = await datares.Content.ReadAsStringAsync(); 
       } 
       else if (finaldata.Contains(":404")) 
       { 
        apiurl = (@"http://api.lootbox.eu/" + "pc/" + "cn/" + tag + "/profile"); 
        datares = await dc.GetAsync(apiurl); 
        finaldata = await datares.Content.ReadAsStringAsync(); 
       } 
       #endregion 
       #region XBOX LIVE 
       else if (finaldata.Contains(":404")) 
       { 
        apiurl = (@"http://api.lootbox.eu/" + "xbl/" + "us/" + tag + "/profile"); 
        datares = await dc.GetAsync(apiurl); 
        finaldata = await datares.Content.ReadAsStringAsync(); 
       } 
       else if (finaldata.Contains(":404")) 
       { 
        apiurl = (@"http://api.lootbox.eu/" + "xbl/" + "eu/" + tag + "/profile"); 
        datares = await dc.GetAsync(apiurl); 
        finaldata = await datares.Content.ReadAsStringAsync(); 
       } 
       else if (finaldata.Contains(":404")) 
       { 
        apiurl = (@"http://api.lootbox.eu/" + "xbl/" + "kr/" + tag + "/profile"); 
        datares = await dc.GetAsync(apiurl); 
        finaldata = await datares.Content.ReadAsStringAsync(); 
       } 
       else if (finaldata.Contains(":404")) 
       { 
        apiurl = (@"http://api.lootbox.eu/" + "xbl/" + "cn/" + tag + "/profile"); 
        datares = await dc.GetAsync(apiurl); 
        finaldata = await datares.Content.ReadAsStringAsync(); 
       } 
       else if (finaldata.Contains(":404")) 
       { 
        apiurl = (@"http://api.lootbox.eu/" + "xbl/" + "global/" + tag + "/profile"); 
        datares = await dc.GetAsync(apiurl); 
        finaldata = await datares.Content.ReadAsStringAsync(); 
       } 
       #endregion 
       #region PSN 
       else if (finaldata.Contains(":404")) 
       { 
        apiurl = (@"http://api.lootbox.eu/" + "psn/" + "us/" + tag + "/profile"); 
        datares = await dc.GetAsync(apiurl); 
        finaldata = await datares.Content.ReadAsStringAsync(); 
       } 
       else if (finaldata.Contains(":404")) 
       { 
        apiurl = (@"http://api.lootbox.eu/" + "psn/" + "global/" + tag + "/profile"); 
        datares = await dc.GetAsync(apiurl); 
        finaldata = await datares.Content.ReadAsStringAsync(); 
       } 
       else if (finaldata.Contains(":404")) 
       { 
        apiurl = (@"http://api.lootbox.eu/" + "psn/" + "cn/" + tag + "/profile"); 
        datares = await dc.GetAsync(apiurl); 
        finaldata = await datares.Content.ReadAsStringAsync(); 
       } 
       else if (finaldata.Contains(":404")) 
       { 
        apiurl = (@"http://api.lootbox.eu/" + "psn/" + "eu/" + tag + "/profile"); 
        datares = await dc.GetAsync(apiurl); 
        finaldata = await datares.Content.ReadAsStringAsync(); 
       } 
       else if (finaldata.Contains(":404")) 
       { 
        apiurl = (@"http://api.lootbox.eu/" + "psn/" + "kr/" + tag + "/profile"); 
        datares = await dc.GetAsync(apiurl); 
        finaldata = await datares.Content.ReadAsStringAsync(); 
       } 
       #endregion 

       DataTable obj = JsonConvert.DeserializeObject(finaldata); 

私はあなたのコードをお見せしましょう並べ替えや何か。

私はJSON.Netを持っていますが、変換する前に、ほとんどの人は

問題があることだった、セットアップにクラスを言った:私は2「勝利」を持っていた:3「競争力」:あなたはJSONで見ることができるように文字列。

このように私の考えでは、クラスを作ることはできませんでした。私は最後のコード行に示すように新しいDataTableを作成しようとしましたが、JsonConvert.DeserializeObject(finaldata);を使用すると"Cannot implicitly convert type object to System.Data.DataTable"と表示されます。.ToString();dates変数、さらに.ToString()も実行しようとしました。

私はこれらの統計情報を表示する適切な方法を必要とするが、例えば、私が見ることができます:

"Stats for user " + obj.Name + ":" 
"Wins: " + obj.Wins 
"Losses: " + obj.Losses 
"Rank: " + obj.Rank 

そして、いやなソリューションをオンライン私の状況で私を助けて。

EDIT:

このソリューションは、いずれかの私のために動作しません:

convert json String to datatable? またはこの Nested Json String to DataTable

もこれを行います:

var token = JToken.Parse(finaldata); 

       if (token.Type == JTokenType.Object) 
        token = new JArray(token); 

       var a = token.ToObject<DataTable>(); 
+1

クラスは絶対に可能であり、繰り返しの名前は重要ではありません。初心者の方は、http://json2csharp.com/のようなツールを使用するといいでしょう。 – Equalsk

答えて

1

あなたは、クラスを使用することができます彼らが言ったように。私はhttp://json2csharp.com/を使用しましたが、VSもそれを行うことができます。

あなたがここでそれを試すことができます:https://dotnetfiddle.net/iaIvOn

using System; 
using Newtonsoft.Json; 

public class Program 
{ 
    public void Main() 
    { 
     var json = @"{""data"":{""username"":""Rezoh"",""level"":305,""games"":{""quick"":{""wins"":""378""},""competitive"":{""wins"":""82"",""lost"":85,""played"":""167""}},""playtime"":{""quick"":""88 hours"",""competitive"":""36 hours""},""avatar"":""https://blzgdapipro-a.akamaihd.net/game/unlocks/0x0250000000000D70.png"",""competitive"":{""rank"":""3392"",""rank_img"":""https://blzgdapipro-a.akamaihd.net/game/rank-icons/season-2/rank-5.png""},""levelFrame"":""https://blzgdapipro-a.akamaihd.net/game/playerlevelrewards/0x025000000000092D_Border.png"",""star"":""https://blzgdapipro-a.akamaihd.net/game/playerlevelrewards/0x025000000000092D_Rank.png""}}"; 

     // read the doc: http://www.newtonsoft.com/json 
     var rootObject = JsonConvert.DeserializeObject<RootObject>(json); 

     Console.WriteLine("Stats for user " + rootObject.Data.Username + ":"); 
     Console.WriteLine("Wins: " + rootObject.Data.Games.Competitive.Wins); 
     Console.WriteLine("Losses: " + rootObject.Data.Games.Competitive.Lost); 
     Console.WriteLine("Rank: " + rootObject.Data.Competitive.Rank); 
    } 

    public class Quick 
    { 
     // Free case support! 
     public string Wins { get; set; } 
    } 

    public class Competitive 
    { 
     public string Wins { get; set; } // you may want to check this string here ;) 
     public int Lost { get; set; } 
     public string Played { get; set; } 
    } 

    public class Games 
    { 
     public Quick Quick { get; set; } 
     public Competitive Competitive { get; set; } 
    } 

    public class Playtime 
    { 
     public string Quick { get; set; } 
     public string Competitive { get; set; } 
    } 

    public class Competitive2 
    { 
     public string Rank { get; set; } 
     // attribute ftw! http://www.newtonsoft.com/json/help/html/SerializationAttributes.htm 
     [JsonProperty(PropertyName = "rank_img")] 
     public string RankImg { get; set; } 
    } 

    public class Data 
    { 
     public string Username { get; set; } 
     public int Level { get; set; } 
     public Games Games { get; set; } 
     public Playtime Playtime { get; set; } 
     public string Avatar { get; set; } 
     public Competitive2 Competitive { get; set; } 
     public string LevelFrame { get; set; } 
     public string Star { get; set; } 
    } 

    public class RootObject 
    { 
     public Data Data { get; set; } 
    } 
} 

出力

Stats for user Rezoh: 
Wins: 82 
Losses: 85 
Rank: 3392 

QuickCompetitiveは多分、ゲームしている場合:

public abstract class Game 
{ 
    public string Wins { get; set; } // you may want to check this string here ;) 
    public int Lost { get; set; } 
    public string Played { get; set; } 
} 

public class Quick : Game // note that Quick game has Lost and PLayed now! 
{ 
} 

public class Competitive : Game 
{ 
} 

、あるいは(@EpicSamコメントで提案されているように):

public class Game 
{ 
    public string Wins { get; set; } // you may want to check this string here ;) 
    public int Lost { get; set; } 
    public string Played { get; set; } 
} 

public class Games 
{ 
    public Game Quick { get; set; } 
    public Game Competitive { get; set; } 
} 
+0

ありがとう!それが動作するか見てみましょう! – bin

+0

なぜあなたはそれを編集しましたか? – bin

+0

@SarmadWahab [バージョン履歴を参照](http://stackoverflow.com/posts/41226164/revisions)と – aloisdg

関連する問題