2012-10-01 23 views
32

Ich versuche, eine JSON-Zeichenfolge in C# zu lesen, aber ich habe Probleme herauszufinden, nur um die Zeichenfolge in C# zu analysieren. Sagen, dass ich die folgende JSON-String habenParse Json String in 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" 
     } 
    } 
] 

ich, dass in einem Arraylist oder Wörterbuch, mit einem Format wie

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

Ich habe Herumspielen mit Json.Net aber die Beispiele analysieren möchte ich Habe gesehen, gib mir keine klare Vorstellung davon, wie ich das machen soll. Was ist der beste Weg, dies zu erreichen? Kann dies wie in jQuery mit einer foreach-Anweisung geschehen?

+0

können Sie [DynamicJson] (http://dynamicjson.codeplex.com/) die C# Objekte aus Json Strings vorzubereiten? – rt2800

Antwort

32

ich Json.net in meinem Projekt bin mit und es funktioniert super.In Ihrem Fall können Sie dies tun, um Ihre json zu analysieren:

EDIT: ich den Code geändert, um es zu lesen Ihre JSON-Datei (Array)

-Code zu analysieren unterstützt:

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"); 
     } 
    } 
} 

Ausgang:

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, können Sie LinqPad verwenden Sie den Code zu testen, leichter als eine Lösung oder ein Projekt in Visual Studio Erstellen von I t hinken.

+0

-1 Original JSON ist ein JArray kein JObject wie in Ihrer Antwort –

+0

@ L.B Sie haben Recht, es war in Eile. Der aktualisierte Code liest das Array jetzt. –

+0

Eigentlich war die erste Lösung (vor den Änderungen) die, die für mich funktionierte. – desto

13

können Sie versuchen, mit System.Web.Script.Serialization.JavaScriptSerializer:

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

es ist in System.Web.Script.Serialization – Guillaume86

+0

Ich glaube wirklich nicht, dass dieser Serializer mit Wörterbüchern funktionieren würde –

+0

es tut, bereits verwendet EDIT: nur getestet meinen Code mit @desto Json, funktioniert gut :) – Guillaume86

1

Anstelle eines Arraylist oder Wörterbuch Sie auch eine dynamische verwenden können. Die meiste Zeit nutze ich dafür EasyHttp, aber sicher wird es von anderen Projekten, die das gleiche tun. Ein Beispiel unter:

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); 

Auf NuGet: EasyHttp

1

Was Sie versuchen, auf ein Wörterbuch deserialisieren ist eigentlich ein Javascript-Objekt JSON serialisiert. In Javascript können Sie dieses Objekt als assoziatives Array verwenden, aber tatsächlich ist es ein Objekt, was den JSON-Standard betrifft.

Sie würde also kein Problem haben Deserialisieren, was Sie mit einem Standard-JSON Serializer haben (wie die .net diejenigen, DataContractJsonSerializer und JavaScriptSerializer) zu einem Objekt (mit Mitgliedern genannt AnwName, AnotherAppName, usw.), sondern tatsächlich zu interpretieren dies als In einem Wörterbuch brauchst du einen Serialisierer, der über die Json-Spezifikation hinausgeht, die meines Wissens nach nichts mit Wörterbüchern zu tun hat.

Ein solches Beispiel ist die, jeder benutzt: JSON .net

Es eine andere Lösung, wenn Sie keine externe lib verwenden möchten, die Ihr Objekt in eine Liste Javascript zu konvertieren, bevor es zu JSON Serialisierung .

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

jetzt, wenn Sie myList zu einem JSON-Objekt serialisiert werden, sollten Sie zu einem List<KeyValuePair<string, ValueDescription>> mit einer der oben genannten Serializer von Deserialisieren fähig sein. Diese Liste wäre dann ziemlich offensichtlich, um in ein Wörterbuch zu konvertieren.

Hinweis: ValueDescription ist diese Klasse:

public class ValueDescription 
{ 
    public string Description { get; set; } 
    public string Value { get; set; } 
} 
12

C# code: um nur einen einzigen Wert zu erhalten, zum Beispiel das Wort "Fahrrad".

//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); 

Ausgang:

bike