Analyser la chaîne Json en C#

J'essaie de lire une chaîne Json en C#, mais j'ai du mal à comprendre comment analyser la chaîne en C#. Dites que j'ai la chaîne Json suivante

[
    {
        "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 cela dans un arraylist ou un dictionnaire, en utilisant un format comme

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

J'ai joué avec Json.Net mais les exemples que j'ai vus ne me donnent pas une idée claire de la façon dont je devrais le faire. Quelle est la meilleure façon d'atteindre cet objectif? Cela ne peut - il pas être fait comme dans jQuery, en utilisant une instruction foreach?

39
demandé sur desto 2012-10-01 19:54:25

5 réponses

J'utilise Json.net dans mon projet et cela fonctionne très bien. Dans votre cas, vous pouvez le faire analyser votre json:

EDIT: j'ai changé le code afin qu'il supporte la lecture de votre fichier json (array)

Code à 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 de créer une solution ou un projet dans Visual Studio je pense.

37
répondu AZ. 2012-10-01 18:41:58
json:
[{"ew":"vehicles","hws":["car","van","bike","plane","bus"]},{"ew":"countries","hws":["America","India","France","Japan","South Africa"]}]

Code C#: pour ne prendre qu'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
15
répondu Kajan Thadsanamoorthy 2015-11-20 10:57:36

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

var json = new JavaScriptSerializer();
var data = json.Deserialize<Dictionary<string, Dictionary<string, string>>[]>(jsonStr);
13
répondu Guillaume86 2016-10-05 17:26:08

Au lieu d'un arraylist ou d'un dictionnaire, vous pouvez également utiliser une dynamique. La plupart du temps j'utilise EasyHttp, mais sûr qu'il y aura d'autres projets qui font 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
répondu Erwin 2012-10-01 15:58:47

Ce que vous essayez de désérialiser dans un dictionnaire est en fait un objet Javascript sérialisé en JSON. En Javascript, vous pouvez utiliser cet objet comme un tableau associatif, mais c'est vraiment un objet, en ce qui concerne le standard JSON.

Donc, vous n'auriez aucun problème à désérialiser ce que vous avez avec un sérialiseur JSON standard (comme les. Net, DataContractJsonSerializer et JavascriptSerializer) à un objet (avec des membres appelés AppName, AnotherAppName, etc), mais pour réellement interprétez ceci comme un dictionnaire, vous aurez besoin d'un sérialiseur qui va plus loin que la spécification Json, qui n'a rien sur les dictionnaires pour autant que je sache.

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

Il existe une autre solution si vous ne voulez pas utiliser une lib externe, qui consiste à convertir votre objet Javascript en une liste avant de le sérialiser en JSON.

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

Maintenant, si vous sérialisez myList en un objet JSON, vous devriez être capable de désérialiser à un List<KeyValuePair<string, ValueDescription>> avec l'un des sérialiseurs susmentionnés. Cette liste serait alors tout à fait évidente à convertir en Dictionnaire.

Note: ValueDescription étant cette classe:

public class ValueDescription
{
    public string Description { get; set; }
    public string Value { get; set; }
}
1
répondu Evren Kuzucuoglu 2012-10-01 16:12:39