2010-10-03 17 views
3

J'ai un fichier au format JSON avec enregistrement pour les utilisateurs individuels. Certains utilisateurs ont un champ de commentaire coincé au milieu de leurs enregistrements. Je veux juste analyser les éléments de haut niveau ( fullName contributorName email)Comment analyser un tableau JSON polymorphe?

en utilisant l'analyseur Newtonsoft.JSON, mais je ne peux pas sembler obtenir à reconnaître des objets individuels. Quand j'analyse la chaîne entière en un grand objet, je ne sais pas comment itérer les individus.

Voici comment j'essayais de le faire (propriété par propriété), mais cela ne fonctionnait pas si elles étaient hors service ou avaient des sous-propriétés. Je dois le mettre dans un objet à la place:

StreamReader re = File.OpenText("C:\\dropbox\\my dropbox\\clients\\towson\\english 317\\Ning Archive\\ning-members.json"); 
JsonTextReader reader = new JsonTextReader(re); 
string ct = ""; 

try 
{ 
    ct += "<table style='border:1px solid black'>"; 
    while (reader.Read()) 
    { 
     if (reader.TokenType == JsonToken.PropertyName) 
     { 
      if (reader.Value.ToString() == "fullName") 
      { 
       reader.Read(); 
       ct += "\r\n\r\n<tr><td>" + reader.Value + "</td>"; 
      } 
      if (reader.Value.ToString() == "contributorName") 
      { 
       reader.Read(); 
       ct += "<td>" + reader.Value + "</td></tr>"; 
      } 
      if (reader.Value.ToString() == "email") 
      { 
       reader.Read(); 
       ct += "<td>" + reader.Value + "</td>"; 
      } 
     } 
    }  
} 
catch { } 

ct+="</table>"; 
namesText.Text = ct; 

Notez le premier enregistrement a un champ de commentaires que je ne me soucie pas, mais est dans la manière de l'ordre lorsque je tente d'analyser comme un flux.

[ 
{ 
    "createdDate": "2010-09-10T14:16:08.271Z", 
    "fullName": "Lisa Meloncon", 
    "gender": "f", 
    "country": "US", 
    "birthdate": "1969-05-14", 
    "comments": [ 
     { 
      "id": "6292914:Comment:272", 
      "contributorName": "0upfj0fd33932", 
      "description": "Thanks for joining! I'm working up a schedule for the students a bit late so I can assess some of their early writing (including the first assignment, a general evaluation of business writing skills) and determine a course that will address their needs. I plan to make liberal use of technology this semester, with a Screencasting assignment, some intermediate Word formatting drills, and various other activities.", 
      "createdDate": "2010-09-10T18:07:38.272Z" 
     } 
    ], 
    "email": "[email protected]", 
    "profilePhoto": "http://api.ning.com:80/files/251IcCtIBC3dGALHpG3ruYfg0Ip*EFJApPyMVGkiVArSUEvF*dK8A5grvPvl8eC7i7H0grhRH4pakLc9jSOww2GpU2OTq2nq/626617250.png?crop=1%3A1", 
    "level": "member", 
    "state": "active", 
    "contributorName": "2z42css3dgvoi" 
}, 
{ 
    "createdDate": "2010-09-08T02:57:00.225Z", 
    "fullName": "Robert Calabrese", 
    "gender": "m", 
    "location": "Baltimore, MD", 
    "country": "US", 
    "zip": "21284", 
    "birthdate": "1989-09-29", 
    "email": "[email protected]", 
    "profilePhoto": "http://api.ning.com:80/files/251IcCtIBC3dGALHpG3ruYfg0Ip*EFJApPyMVGkiVArSUEvF*dK8A5grvPvl8eC7i7H0grhRH4pakLc9jSOww2GpU2OTq2nq/626617250.png?crop=1%3A1", 
    "level": "member", 
    "state": "active", 
    "contributorName": "199ru4hzwc4n4" 
}, 
{ 
    "createdDate": "2010-09-04T22:36:51.158Z", 
    "fullName": "Regis Bamba", 
    "gender": "m", 
    "location": "Baltimore, MD", 
    "country": "US", 
    "zip": "21210", 
    "birthdate": "1986-09-29", 
    "email": "rbamba2xxx.edu", 
    "profilePhoto": "http://api.ning.com:80/files/251IcCtIBC3dGALHpG3ruYfg0Ip*EFJApPyMVGkiVArSUEvF*dK8A5grvPvl8eC7i7H0grhRH4pakLc9jSOww2GpU2OTq2nq/626617250.png?crop=1%3A1", 
    "level": "member", 
    "state": "active", 
    "contributorName": "2seadgzt89n6x" 
}, 
+0

Veuillez indiquer votre code d'analyse actuel. –

Répondre

9

Quelque chose comme:

JArray root = JArray.Load(reader); 
foreach(JObject o in root) 
{ 
    ct += "\r\n\r\n<tr><td>" + (string)o["fullName"] + "</td>"; 
    ct += "<td>" + (string)o["contributorName"] + "</td>"; 
    ct += "<td>" + (string)o["email"] + "</td>"; 
} 

Nous utilisons une conversion explicite pour obtenir une valeur de chaîne de la JToken retourné par JObject.Item. Toutefois, vous devez envisager d'utiliser StringBuilder plutôt que de concaténation pour obtenir des performances.

+0

Excellent! Est-ce que c'est ce que LINQ peut faire pour moi? – Caveatrob

+0

@Caveatrob, LINQ to JSON est inspiré de LINQ, et peut être utilisé avec LINQ to Objects. Cependant, ce n'est pas un fournisseur LINQ, et ma réponse n'utilise aucune fonctionnalité LINQ. –