2012-05-08 20 views
16

quindi sono abbastanza nuovo alla programmazione ma sto cercando di approfondirlo. Recentemente ho iniziato a partecipare a un progetto per creare un programma WinForm per un sito Web che utilizza un sistema API in JSON.Analisi dell'API JSON in C#

Non ho mai usato un'API prima quindi non sono abbastanza sicuro di come funzioni, ma dopo averlo guardato per alcuni minuti, mi sembra di averne il senso. Quello che non capisco è come funziona esattamente l'analisi di JSON in C#.

Ho trovato this link dopo una piccola ricerca su google. E ho funzionato (in qualche modo) con questo codice.

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

Quindi, per me sembra che abbia l'analisi di 1 pagina fatta e gestita, ma quando mi muovo sul secondo ottengo questo errore.

Errore durante la lettura jobject da JsonReader. L'elemento corrente di JsonReader non è un oggetto: StartArray. Percorso '', riga 1, posizione 1.

Quindi credo che la mia domanda è, come faccio a parse più di 1 pagina o chiamare il numero di JSON e quale sarebbe il modo più semplice per rompere ogni sezione del JSON oggetto (come status, error, e token, in C# stringhe?

+2

Dall'aspetto, la seconda richiesta non restituisce JSON valido. Hai verificato che i dati restituiti sono ciò che pensi che sia? –

+0

Bene, il token non rimane mai uguale, ma è valido per 24 ore. Ho aperto manualmente l'API in un browser e ho ripreso [questo] (http://pastebin.com/3anJMwsZ). Quindi mi sembra JSON valido per me, ma l'errore potrebbe essere nella chiamata per scaricare la stringa che ha 'sToken' alla fine. – Cistoran

+1

Funzionalmente, il tuo codice sembra buono; inoltre, la risposta JSON che hai fornito sembra valida. È possibile che venga restituito qualcos'altro dalla chiamata a DownloadString()? Per motivi di sanità mentale, prova a stampare esattamente ciò che viene restituito da quella chiamata al metodo senza analizzarlo. –

risposta

45

hai cercato di JArray invece? A seconda del tipo di oggetto che si sta tentando di restituire

WebClient client = new WebClient(); 
var data = client.DownloadString(""); 
var jArray = JArray.Parse(data); 
+2

+1 è probabilmente nella doco da qualche parte ma ci si aspetterebbe che l'API JSON.Net sia un po 'più intuitiva ... grazie per questa risposta :-) – Jonno

0

è possibile tagliare ogni oggetto JSON (Array) in più oggetto utilizzando cicli for il C# API è System.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”); 
     } 
    } 
} 
2

JSON richiede parentesi per matrici e virgole tra mult oggetti piccoli.

Questo è per the JSON standard. Raccomando anche l'uso di JSON.net via NuGet invece del parser JSON nativo a meno che non sia eccessivo e non si possa avere un eccesso eccessivo.

Ad esempio, il parsing di un file con due oggetti JSON separati - di seguito non funziona secondo lo standard JSON (manca una virgola tra i 2 oggetti ed i due oggetti non sono incapsulate tra parentesi):

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

I seguenti 3 oggetti JSON analizzati da un file non di lavoro (ha staffe per gli oggetti multipli e le virgole tra gli oggetti):

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