2011-10-08 17 views
7

Sto cercando un codice/lib di esempio per decodificare una stringa JSON utilizzando C#.Come decodificare una stringa JSON usando C#?

per decodificare posso fare questo:

var data = new Dictionary<string,string>(); 
data.Add("..", "..."); 
var json_encoded = new JavaScriptSerializer().Serialize(data); 

ma per decodificare, come faccio?

var json_decoded = ?? 

Grazie!

+0

Basta usare [Json.NET] (http: // james.newtonking.com/projects/json-net.aspx), è possibile serializzare e deserializzare da e verso qualsiasi tipo che si desidera creare. –

+0

possibile duplicato di [JS Deserialize C#] (http://stackoverflow.com/questions/7895105/json-deserialize-c-sharp) – nawfal

risposta

10

Si può fare questo:

var data = new Dictionary<string, string>(); 
data.Add("foo", "baa"); 

JavaScriptSerializer ser = new JavaScriptSerializer(); 
var JSONString = ser.Serialize(data); //JSON encoded 

var JSONObj = ser.Deserialize<Dictionary<string, string>>(JSONString); //JSON decoded 
Console.Write(JSONObj["foo"]); //prints: baa 
+3

Va notato che questo non deserializza la stringa JSON su un tipo, che potrebbe essere soddisfacente in determinate istanze. Trovo deserializzare la stringa in un tipo è una soluzione molto più robusta. –

8

Questo richiederà JSON e convertirlo in una classe fortemente tipizzata di cui si specifica (T)

public static T Deserialize<T>(string json) 
     { 
      var obj = Activator.CreateInstance<T>(); 
      using(var ms = new MemoryStream(Encoding.Unicode.GetBytes(json))) 
      { 
       var serializer = new DataContractJsonSerializer(obj.GetType()); 
       obj = (T) serializer.ReadObject(ms); 
       return obj; 
      } 
     } 

Questo richiederà una classe e serializzare come JSON

public static string Serialize<T>(T obj) 
    { 
     var serializer = new DataContractJsonSerializer(obj.GetType()); 
     using (var ms = new MemoryStream()) 
     { 
      serializer.WriteObject(ms, obj); 
      return Encoding.Default.GetString(ms.ToArray()); 
     } 
    } 

Nota: Nel primo esempio è necessario disporre di una classe di supporto per specificare il tipo T. Quindi, se hai detto che che T è di tipo User si avrebbe bisogno di avere questo specificato da qualche parte:

public class User 
    { 
     public string Username { get; set; } 
     public string Firstname { get; set; } 
    } 
+1

Potrebbe valere la pena di costruire * un oggetto * 'DataContractJsonSerializer' (per tipo serializzabile) invece di costruirne uno nuovo per ogni serializzazione? – Timwi

+0

@Timwi, dipende. Ti costerà più memoria per contenere le istanze, ma se non lo farai sarà meno economico in termini di velocità. Si riduce davvero alla tua situazione specifica. Idealmente, vorresti mantenere i serializzatori che verranno usati spesso e buttare via quelli che non lo faranno. –

Problemi correlati