2013-07-08 2 views
0

Je rencontre des problèmes avec l'extraction de valeurs json dans C#.C# parsing json: erreur lors de la lecture de l'objet json

http://i.stack.imgur.com/Uxn8e.png

Voici le code en question:

var json2 = new WebClient().DownloadString("http://fetch.json.url.here" + Input_Textbox.Text); 
JObject o2 = JObject.Parse(json2); 

string he_ident = (string)o2["he_ident"]; 
string le_ident = (string)o2["le_ident"]; 

Console.WriteLine(he_ident); 
Console.WriteLine(le_ident); 

Ligne 204 est: JObject o2 = JObject.Parse(json2);

JSON est la suivante: [{"le_ident":"06L","he_ident":"24R"},{"le_ident":"06R","he_ident":"24L"},{"le_ident":"07L","he_ident":"25R"},{"le_ident":"07R","he_ident":"25L"}]

J'ai aussi essayé avec un seul ensemble de le_ident et he_ident, tel que [{"le_ident":"06L","he_ident":"24R"}] mais il jette encore la même erreur.

Des idées?

+0

Puisqu'il semble que vous utilisez JSON.Net, avez-vous essayé d'utiliser JsonConvert.Deserialize() 'dans une autre solution? –

Répondre

1

Personnellement, l'approche la plus propre à prendre est de définir une classe pour la signature de l'objet que vous vous attendez à prendre:

class Entity { 
    public he_ident { get;set; } 
    public le_ident { get;set; } 
} 

Ensuite, il suffit d'appeler DeserializeObject() dans une collection:

var entities = JsonConvert.DeserializeObject<List<Entity>>(json2); 

Y ous devriez être en mesure d'accéder à ce alors comme tout objet C#:

foreach(var entity in entities) { 
    Console.WriteLine(entity.he_ident); 
    Console.WriteLine(entity.le_ident); 
} 

Cela ne fonctionnera pas si votre signature JSON est dynamique bien (ou sera un peu fastidieux, que vous auriez à définir des classes pour chacune de vos signatures). Mais personnellement, je trouve que cette approche élimine la fadeur qui a des choses comme ArrayList, et introduit une saisie stricte dans votre code, que je trouve généralement se prêter à une structure plus forte et plus propre dans un environnement C#.

+0

A travaillé magnifiquement! – Spencer

0

Que JSON est une liste pas un dictionnaire.

Donc ce que vous devez faire est la suivante:

string he_ident = (string)(((ArrayList)o2)[0])["he_ident"]; 

(Ou une boucle sur la liste)

Les données JSON:

{"le_ident":"06L"} 

devrait travailler avec le code que vous avez Là.

+0

Je lui ai donné un coup de feu, mais il jette cette erreur: 'Impossible de convertir le type 'Newtonsoft.Json.Linq.JObject' en 'System.Collections.ArrayList'' – Spencer

0

Vous devez utiliser jarray au lieu de jobject pour les tableaux de JSON:

var json = new WebClient().DownloadString(...); 
    JArray array = JArray.Parse(json); 
    string he_ident = (string)array[0]["he_ident"]; 
    string le_ident = (string)array[0]["le_ident"];