web-dev-qa-db-ja.com

C#でのJSONAPIの解析

ですから、私はプログラミングにかなり慣れていませんが、もっと深くプログラミングしたいと思っています。私は最近、JSONのAPIシステムを使用するWebサイト用のWinFormプログラムを作成するプロジェクトに参加し始めました。

私はこれまでAPIを使用したことがないので、どのように機能するかはよくわかりませんが、数分間見てみると、その要点がわかっているようです。私が得られないのは、C#でJSONを正確に解析する方法です。

私は見つけました このリンク 少しグーグル検索した後。そして、私はそれをこのコードで(ある程度)機能させました。

static void Main(string[] args)
{
        WebClient c = new WebClient();
        var vLogin = c.DownloadString("https://www.openraid.us/index.php/api/login/username/password");
        //Returns string 
        //{"status":1,"error":null,"token":"250-1336515541-c48d354d96e06d488d1a2530071ef07c9532da26"} 
        //Token = random, no decisive length*/
        JObject o = JObject.Parse(vLogin);
        Console.WriteLine("Login Status: " + o["status"]);
        String sToken = "" + o["token"];
        Console.WriteLine(sToken);
        Console.WriteLine("");
        //Breaks after this
        var myRaids = c.DownloadString("https://www.openraid.us/index.php/api/myraids/"+sToken);
        JObject r = JObject.Parse(myRaids); //error occurs here
        String sEventId = "" + r["event_id"];
        Console.WriteLine("Event ID: " + sEventId);
        Console.ReadLine();
}

したがって、私には1ページの解析が完了して処理されたように見えますが、2番目のページに移動すると、このエラーが発生します。

JsonReaderからのJObjectの読み取りエラー。現在のJsonReaderアイテムはオブジェクトではありません:StartArray。パス ''、行1、位置1。

だから私の質問は、JSONの複数のページまたは呼び出しを解析するにはどうすればよいですか?JSONオブジェクトの各セクション(statuserrortokenなど)をC#文字列に分割する最も簡単な方法は何ですか?

16
Cistoran

代わりにJArrayを試しましたか?返そうとしているオブジェクトの種類によって異なります

WebClient client = new WebClient();
var data = client.DownloadString("");
var jArray = JArray.Parse(data);
45
sjokko

JSONには、配列の括弧と複数のオブジェクト間のコンマが必要です。

これは JSON標準による です。また、ネイティブJSONパーサーの代わりに JSON.net via NuGet を使用することをお勧めします。ただし、それがやり過ぎで、余分な膨張が発生しない場合を除きます。

たとえば、2つの別々のJSONオブジェクトを含むファイルの解析-以下はJSON標準では機能しません(2つのオブジェクトの間にコンマがなく、2つのオブジェクトは括弧でカプセル化されていません):

{"status":1,"error":null}
{"status":2,"error":null}

ファイルから解析された次の3つのJSONオブジェクトは機能します(複数のオブジェクトの括弧とオブジェクト間のコンマがあります)。

[{"glossary": {"title": "fun glossary","SeeAlso": ["GML", "XML"]},
{"glossary": {"title": "grey glossary","SeeAlso": ["GML", "XML"]},
{"glossary": {"title": "blue glossary","SeeAlso": ["GML", "XML"]}]
2
Kyle

C#APIがSystem.Jsonであるforループを使用して、すべてのJSONオブジェクト(配列)をより多くのオブジェクトにカットできます。

var jsonArray = JsonArray.Parse(st);//st is the string which contain the JSON objects
foreach (var item in jsonArray) {
    JsonObject ob = new JsonObject(item);
    foreach (var t in ob.Values) {
        JsonObject oo = new JsonObject(t);
        foreach (var x in oo) {
            textBox1.AppendText(x.Key + “ : ” + x.Value + “\n”);
        }
    }
}
0
Ibraheem Osama