2012-10-01 6 views
32

J'essaye de lire une chaîne Json en C#, mais j'ai du mal à comprendre comment analyser la chaîne en C#. Dire que j'ai la chaîne JSON suivanteParse Json chaîne en C#

[ 
    { 
     "AppName": { 
      "Description": "Lorem ipsum dolor sit amet", 
      "Value": "1" 
     }, 
     "AnotherAppName": { 
      "Description": "consectetur adipisicing elit", 
      "Value": "String" 
     }, 
     "ThirdAppName": { 
      "Description": "sed do eiusmod tempor incididunt ut labore et dolore magna aliqua", 
      "Value": "Text" 
     }, 
     "Application": { 
      "Description": "Ut enim ad minim veniam", 
      "Value": "100" 
     }, 
     "LastAppName": { 
      "Description": "quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat", 
      "Value": "ZZZ" 
     } 
    } 
] 

Je veux analyser que dans un ArrayList ou un dictionnaire, en utilisant un format comme

descriptionList["AppName"] = "Lorem ipsum dolor sit amet"; 
valueList["AppName"] = "1"; 

J'ai été à jouer autour avec Json.Net mais les exemples I J'ai vu ne me donne pas une idée claire de comment je devrais faire cela. Quel est le meilleur moyen d'y parvenir? Est-ce que cela peut être fait comme dans jQuery, en utilisant une instruction foreach?

+0

Pouvez-vous utiliser [DynamicJson] (http://dynamicjson.codeplex.com/) pour préparer les objets C# de cordes Json? – rt2800

Répondre

32

J'utilise Json.net dans mon projet et il fonctionne très bien.En vous cas, vous pouvez le faire pour analyser votre JSON:

EDIT: J'ai changé le code pour qu'il supporte la lecture de votre fichier JSON (tableau)

Code pour analyser:

void Main() 
{ 
    var json = System.IO.File.ReadAllText(@"d:\test.json"); 

    var objects = JArray.Parse(json); // parse as array 
    foreach(JObject root in objects) 
    { 
     foreach(KeyValuePair<String, JToken> app in root) 
     { 
      var appName = app.Key; 
      var description = (String)app.Value["Description"]; 
      var value = (String)app.Value["Value"]; 

      Console.WriteLine(appName); 
      Console.WriteLine(description); 
      Console.WriteLine(value); 
      Console.WriteLine("\n"); 
     } 
    } 
} 

sortie:

AppName 
Lorem ipsum dolor sit amet 
1 


AnotherAppName 
consectetur adipisicing elit 
String 


ThirdAppName 
sed do eiusmod tempor incididunt ut labore et dolore magna aliqua 
Text 


Application 
Ut enim ad minim veniam 
100 


LastAppName 
quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat 
ZZZ 

BTW, vous pouvez utiliser LinqPad pour tester votre code, plus facile que la création d'une solution ou d'un projet dans Visual studio I t hink.

+0

-1 Original json est un JArray pas un JObject comme dans votre réponse –

+0

@ L.B Vous avez raison, il était pressé. Le code mis à jour lit le tableau maintenant. –

+0

En fait, la première solution (avant les modifications) était celle qui fonctionnait pour moi. – desto

13

vous pouvez essayer avec System.Web.Script.Serialization.JavaScriptSerializer:

var json = new JavaScriptSerializer(); 
var data = json.Deserialize<Dictionary<string, Dictionary<string, string>>[]>(jsonStr); 
+0

il est disponible dans System.Web.Script.Serialization – Guillaume86

+0

Je ne pense vraiment pas que ce sérialiseur fonctionnerait avec les dictionnaires –

+0

il le fait, déjà utilisé EDIT: juste testé mon code avec @desto json, fonctionne bien :) – Guillaume86

1

au lieu d'un ArrayList ou un dictionnaire, vous pouvez également utiliser une dynamique. La plupart du temps j'utilise EasyHttp pour cela, mais il y aura sûrement d'autres projets qui feront de même. Un exemple ci-dessous:

var http = new HttpClient(); 
http.Request.Accept = HttpContentTypes.ApplicationJson; 
var response = http.Get("url"); 
var body = response.DynamicBody; 
Console.WriteLine("Name {0}", body.AppName.Description); 
Console.WriteLine("Name {0}", body.AppName.Value); 

Sur NuGet: EasyHttp

1

Qu'est-ce que vous essayez de désérialiser à un dictionnaire est en fait un objet Javascript sérialisé à JSON. En Javascript, vous pouvez utiliser cet objet comme un tableau associatif, mais c'est vraiment un objet, en ce qui concerne la norme JSON.

Vous auriez pas de problème désérialisation ce que vous avez avec un sérialiseur norme JSON (comme les .net, DataContractJsonSerializer et JavaScriptSerializer) à un objet (avec les membres appelés AppName, AnotherAppName, etc.), mais d'interpréter cela comme en fait un dictionnaire vous aurez besoin d'un sérialiseur qui va plus loin que la spécification Json, qui n'a rien à propos de Dictionnaires autant que je sache.

Un tel exemple est celui que tout le monde utilise: JSON .net

Il y a une autre solution si vous ne voulez pas utiliser une lib externe, ce qui est de convertir votre objet Javascript à une liste avant sérialisation à JSON .

var myList = []; 
$.each(myObj, function(key, value) { myList.push({Key:key, Value:value}) }); 

maintenant si vous sérialisez myList à un objet JSON, vous devriez être capable de désérialisation à un List<KeyValuePair<string, ValueDescription>> avec l'une des serializers mentionnés ci-dessus. Cette liste serait alors assez évidente pour être convertie en dictionnaire.

Note: ValeurDescription étant cette classe:

public class ValueDescription 
{ 
    public string Description { get; set; } 
    public string Value { get; set; } 
} 
12
json: 
[{"ew":"vehicles","hws":["car","van","bike","plane","bus"]},{"ew":"countries","hws":["America","India","France","Japan","South Africa"]}] 

C# code: pour prendre une seule valeur, par exemple le mot "vélo".

//res=[{"ew":"vehicles","hws":["car","van","bike","plane","bus"]},{"ew":"countries","hws":["America","India","France","Japan","South Africa"]}] 

     dynamic stuff1 = Newtonsoft.Json.JsonConvert.DeserializeObject(res); 
     string Text = stuff1[0].hws[2]; 
     Console.WriteLine(Text); 

sortie:

bike