web-dev-qa-db-fra.com

Parse Json string en C #

J'essaie de lire une chaîne Json en C #, mais je ne parviens pas à 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";

Je me suis amusé avec Json.Net, mais les exemples que j'ai vus ne me donnent pas une idée précise de la façon dont je devrais procéder. Quel est le meilleur moyen d'y parvenir? Est-ce que cela peut être fait comme dans jQuery, en utilisant une déclaration foreach?

46
desto

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

EDIT: j'ai changé le code pour qu'il prenne en charge 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.

43
AZ.
json:
[{"ew":"vehicles","hws":["car","van","bike","plane","bus"]},{"ew":"countries","hws":["America","India","France","Japan","South Africa"]}]

c # code: 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
21

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

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

Ce que vous essayez de désérialiser dans un dictionnaire est en réalité un objet Javascript sérialisé en JSON. En Javascript, vous pouvez utiliser cet objet comme un tableau associatif, mais il s’agit en réalité d’un objet au sens de la norme JSON.

Ainsi, 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) en un objet (avec des membres nommés AppName, AnotherAppName, etc.), mais si vous interprétez cela comme un dictionnaire, vous ' Vous aurez besoin d’un sérialiseur allant au-delà de la spécification Json, qui n’a rien à voir avec les dictionnaires à ma connaissance.

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

Il existe une autre solution si vous ne souhaitez pas utiliser une bibliothèque externe, qui consiste à convertir votre objet Javascript en 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 sur un objet JSON, vous devriez être capable de désérialiser sur un List<KeyValuePair<string, ValueDescription>> avec l’un des sérialiseurs susmentionnés. Il serait alors tout à fait évident de convertir cette liste en dictionnaire.

Remarque: ValueDescription étant cette classe:

public class ValueDescription
{
    public string Description { get; set; }
    public string Value { get; set; }
}
1
Evren Kuzucuoglu

Au lieu d'un dictionnaire ou d'un dictionnaire, vous pouvez également utiliser une dynamique. La plupart du temps, j'utilise EasyHttp pour cela, mais il est certain que d'autres projets le feront également. 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
Erwin