2012-10-01 14 views
32

Sto provando a leggere una stringa Json in C#, ma ho difficoltà a capire solo come analizzare la stringa in C#. Dire che ho la seguente stringa JSONParse Json stringa 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" 
     } 
    } 
] 

voglio analizzare che in un ArrayList o un dizionario, utilizzando un formato simile

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

mi Smanetto con Json.Net ma gli esempi I ho visto non darmi un'idea chiara di come dovrei farlo. Qual è il modo migliore per raggiungere questo obiettivo? Non si può fare come in jQuery, usando una dichiarazione foreach?

+0

si può utilizzare [DynamicJson] (http://dynamicjson.codeplex.com/) per preparare gli oggetti C# di stringhe JSON? – rt2800

risposta

32

sto usando Json.net nel mio progetto e funziona benissimo.In voi caso, si può fare questo per analizzare il vostro JSON:

EDIT: ho cambiato il codice in modo che supporta la lettura di file JSON (array)

Codice da analizzare:

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

uscita:

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, è possibile utilizzare LinqPad per testare il codice, più facile che creare una soluzione o un progetto in Visual Studio I t hink.

+0

-1 JSON originale è un JArray non un JObject come nella tua risposta –

+0

@ L.B Hai ragione, era di fretta. Il codice aggiornato legge l'array ora. –

+0

In realtà, la prima soluzione (prima delle modifiche) era quella che funzionava per me. – desto

13

si può provare con System.Web.Script.Serialization.JavaScriptSerializer:

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

è disponibile in System.Web.Script.Serialization – Guillaume86

+0

Davvero non penso che questo serializzatore possa funzionare con i dizionari –

+0

lo fa, lo ha già utilizzato EDIT: ho appena testato il mio codice con @desto json, funziona bene :) – Guillaume86

1

Invece di un ArrayList o di dizionario è possibile utilizzare anche una dinamica. Il più delle volte io uso EasyHttp per questo, ma sicuramente ci saranno altri progetti che fanno lo stesso. Un esempio di seguito:

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

Su NuGet: EasyHttp

1

cosa si sta cercando di deserializzare a un dizionario è in realtà un oggetto JavaScript serializzato per JSON. In Javascript, puoi usare questo oggetto come array associativo, ma in realtà è un oggetto, per quanto riguarda lo standard JSON.

Quindi non avresti alcun problema deserializzare quello che hai con un serializzatore JSON standard (come .net, DataContractJsonSerializer e JavascriptSerializer) su un oggetto (con membri chiamati AppName, AnotherAppName, ecc.), Ma in realtà interpretarlo come un dizionario ti servirà un serializzatore che va oltre la specifica Json, che per quanto ne so non ha nulla sui dizionari.

Un esempio è quello tutti usano: JSON .net

C'è un altra soluzione se non si desidera utilizzare un lib esterna, che è quello di convertire il vostro oggetto Javascript per una lista prima di serializzazione a JSON .

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

ora se si serializzare myList a un oggetto JSON, si dovrebbe essere in grado di deserializzazione per un List<KeyValuePair<string, ValueDescription>> con uno qualsiasi dei suddetti serializzatori. Tale elenco sarebbe quindi abbastanza ovvio per la conversione in un dizionario.

Nota: ValoreDescrizione essendo questa 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"]}] 

codice C#: per prendere solo un singolo valore, ad esempio la parola "bici".

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

uscita:

bike