2015-05-21 25 views
5

Ho una serie di dizionari che ho creato in javascript. Dopo la serializzazione a JSON ricevo la seguente stringa:Deserialize json array of dictionaries in C#

"[{\"key\":\"60236\",\"value\":\"1\"},{\"key\":\"60235\",\"value\":\"gdsfgdfsg\"},{\"key\":\"60237\",\"value\":\"1\"}]" 

Sto avendo un momento difficile ottenere questo deserializzato in una lista o dizionario in C#.

ho provato:

Dictionary<int, string> values = JsonConvert.DeserializeObject<Dictionary<int, string>>(Model.Json); 

ma che non funziona.

+0

cambiare il in e vedere se questo risolve il problema. la chiave è definita tra due virgolette, che potrebbe essere il problema – faljbour

risposta

11

Ci sono diversi modi che si possono estrarre i coppie chiave/valore per la costruzione di un dizionario:

var dict = "[{\"key\":\"60236\",\"value\":\"1\"}, 
      {\"key\":\"60235\",\"value\":\"gdsfgdfsg\"}, 
      {\"key\":\"60237\",\"value\":\"1\"}]"; 

Usa List<KeyValuePair<int, string>>

var dictionary = JsonConvert.DeserializeObject<List<KeyValuePair<int, string>>>(dict) 
           .ToDictionary(x => x.Key, y => y.Value); 

Utilizzare un oggetto personalizzato che rappresenta le coppie e quindi creare un dizionario dalla tua collezione.

var output = JsonConvert.DeserializeObject<List<Temp>>(dict); 
var dictionary = output.ToDictionary(x => x.Key, y => y.Value); 

public class Temp 
{ 
    public int Key { get; set; } 
    public string Value { get; set; } 
} 

Infine, se sei a disagio con l'utilizzo di un oggetto "usa e getta" solo per la deserializzazione personalizzato, è possibile prendere un piccolo calo di prestazioni e uso dinamico, invece.

var dictionary = JsonConvert.DeserializeObject<List<dynamic>>(dict) 
           .ToDictionary (x => (int)x.key, y => (string)y.value); 
2

quello che suggerisco è per cercare di vedere che cosa rappresenta effettivamente il tuo json. È possibile creare una classe qui su Json2CSharp e utilizzare questa classe/Elenco di questa classe (a seconda che il proprio json sia in forma di array o oggetto di classe semplice).

Basta passare il tipo a JsonConvert.DeserializeObject parte del tipo di classe. per esempio

var output = JsonConvert.DeserializeObject<List<Class>>(json); 

Nel tuo caso è solo una serie di classe Temp

public class Temp 
{ 
    public string key { get; set; } 
    public string value { get; set; } 
} 

Sp tutto ciò che serve è: -

var output = JsonConvert.DeserializeObject<List<Temp>>(json); 

L'è possibile convertire questo elenco per dizionario come suggerito in altra risposta: -

var dictionary = output.ToDictionary(x => x.Key, y => y.Value); 

Questo mi aiuta sempre. Spero che ti aiuti anche tu.