2012-03-01 6 views
3

Je suis en train d'accéder à toutes les catégories dans le premier niveau dans une réponse Foursquare: -Lire Foursquare Réponse JSON avec JSON.NET

{ 
    "meta": { 
     "code": 200 
    }, 
    "response": { 
     "categories": [{ 
      "id": "4d4b7104d754a06370d81259", 
      "name": "Arts & Entertainment", 
      "pluralName": "Arts & Entertainment", 
      "shortName": "Arts & Entertainment", 
      "icon": { 
       "prefix": "https:\/\/foursquare.com\/img\/categories\/arts_entertainment\/default_", 
       "sizes": [32, 44, 64, 88, 256], 
       "name": ".png" 
      }, 
      "categories": [{ 
       "id": "4bf58dd8d48988d1e1931735" 

utilisant JSON.NET:-

JObject o = JObject.Parse(FoursquareObject.GetCategories()); 
IList<string> categories = o.SelectToken("categories[0]").Select(s => (string)s).ToList(); 

FoursquareObject.GetCategories() renvoie la réponse sous forme de chaîne. J'ai aussi essayé: -

JArray categories = (JArray)o["categories"]; 

var categories = (string) o["response[0].categories"]; 

... et de nombreuses variations de, juste pour voir la réponse dans la variable et toujours obtenir des erreurs « référence d'objet » ou « ne peut pas être {null} ». Je sais que je suis proche, mais pour la vie de moi ne peut pas savoir comment obtenir à la partie «catégories» de la réponse ...

Quelqu'un peut-il me diriger dans la bonne direction?

L'aide est appréciée. ;)

MISE À JOUR:

Merci aux réponses de LB et Meklarian, j'ai ajouté ce code (et variantes): -

dynamic four = JsonConvert.DeserializeObject(FoursquareObject.GetCategories()); 
     foreach (var cat in four) 
     { 
      context.Response.Write(cat.response.categories.id); 
     } 

Mais peu importe ce que j'essaie dans la Write() , je reçois toujours: -

'Newtonsoft.Json.Linq.JProperty' ne contient pas de définition pour 'réponse'

J'ai essayé beaucoup de combinaisons, pas de chance. J'ai vérifié la sortie du fichier JSON, j'obtiens la réponse JSON pure comme une chaîne. Juste une note, que les catégories peuvent exister dans les catégories, d'où la raison pour laquelle le JSON semble être brisé. Je vous assure que ce n'est pas le cas. Je suis complètement coincé!

+1

Ce lien peut être utile http://stackoverflow.com/ questions/9522044/essayer-de-consommer-smartystreets-json-avec-json-net-ne peut-deserialize-json-a/9522266 # 9522266 –

+0

@LB cela semble certainement être juste le billet! +1 – dooburt

Répondre

2

Il y a plusieurs façons d'analyser ceci; mais dans le style que vous avez initialement présenté, vous devriez essayer d'y accéder avec les indexeurs []. Notez que vos données ont un objet racine avec deux propriétés, meta et response. En supposant response ne peut être nulle, vous pouvez accéder directement à partir categories comme ceci:

var root = JObject.Parse(/* your json string here */); 
var categories = root["response"]["categories"]; 
var firstCategory = categories[0]; 

Notez que vous pouvez utiliser des chaînes correspondant à des noms de propriétés à descendre dans les niveaux imbriqués, et des entiers à l'index dans des tableaux de portée.

Voici le reste d'un exemple de programme qui peut analyser l'extrait json que vous avez fourni.

using System.Windows.Forms; 

using Newtonsoft.Json; 
using Newtonsoft.Json.Linq; 
using Newtonsoft.Json.Serialization; 

namespace _4sqCatResponse 
{ 
    class Program 
    { 
     [STAThread] 
     static void Main(string[] args) 
     { 
      OpenFileDialog dlg = new OpenFileDialog(); 
      if(dlg.ShowDialog() != DialogResult.OK){return;} 
      string json = System.IO.File.ReadAllText(dlg.FileName); 

      var root = JObject.Parse(json); 
      var categories = root["response"]["categories"]; 
      var firstCategory = categories[0]; 
      Console.WriteLine("id: {0}", firstCategory["id"]); 
      Console.WriteLine("name: {0}", firstCategory["name"]); 
      Console.WriteLine("pluralName: {0}", firstCategory["pluralName"]); 
      Console.WriteLine("shortName: {0}", firstCategory["shortName"]); 
      var icon = firstCategory["icon"]; 
      Console.WriteLine("icon.prefix: {0}", icon["prefix"]); 
      Console.WriteLine("icon.sizes[0]: {0}", icon["sizes"][0]); 
      Console.WriteLine("icon.name: {0}", icon["name"]); 

      Console.ReadKey(); 
     } 
    } 
} 

Aussi je suis un peu confus par votre échantillon json; Je pense que vous avez peut-être superposé une partie de votre échantillon ou découpé quelque chose car vous avez des catégories imbriquées dans des catégories.S'il y a bien une catégorie de 2e niveau dans votre catégorie élément et qui est ce que vous voulez, vous pouvez y accéder avec ceci:

var categories2 = root["response"]["categories"][0]["categories"][0]; 
Console.WriteLine("inner categories id: {0}", categories2["id"]); 

est ici la source JSON je tester, copié de la vôtre, mais avec la fermeture } et ] marques où nécessaire pour l'analyser.

{ 
    "meta": { 
     "code": 200 
    }, 
    "response": { 
     "categories": [{ 
      "id": "4d4b7104d754a06370d81259", 
      "name": "Arts & Entertainment", 
      "pluralName": "Arts & Entertainment", 
      "shortName": "Arts & Entertainment", 
      "icon": { 
       "prefix": "https:\/\/foursquare.com\/img\/categories\/arts_entertainment\/default_", 
       "sizes": [32, 44, 64, 88, 256], 
       "name": ".png" 
      }, 
      "categories": [{ 
       "id": "4bf58dd8d48988d1e1931735" 
       }] 
      }] 
    } 
} 
+0

+1 pour une réponse aussi complète;) – dooburt

+0

Après avoir expérimenté les deux réponses, cela m'a conduit sur le bon chemin et j'ai résolu le problème. Merci à vous deux pour vos réponses. – dooburt

1

Je pense que cela devrait fonctionner

dynamic four2 = JsonConvert.DeserializeObject(FoursquareObject.GetCategories()); 
foreach(var cat in four2.response.categories) 
{ 
    Console.WriteLine(cat.id + " " + cat.name + " " + cat.icon.prefix); 
}