2011-10-08 31 views
7

Estoy buscando un código de ejemplo/lib para decodificar una cadena JSON usando C#.¿Cómo decodificar una cadena JSON usando C#?

a decodificar lo que puedo hacer esto:

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

pero para decodificar, ¿Cómo lo hago?

var json_decoded = ?? 

¡Gracias!

+0

Sólo tiene que utilizar [Json.NET] (http: // james.newtonking.com/projects/json-net.aspx), puede serializar y deserializar desde y hacia cualquier tipo que desee crear. –

+0

posible duplicado de [Json Deserialize C#] (http://stackoverflow.com/questions/7895105/json-deserialize-c-sharp) – nawfal

Respuesta

10

usted puede hacer esto:

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

Debe tenerse en cuenta que esto no deserializa la cadena JSON a un Tipo, lo que podría estar bien en ciertas instancias. Encuentro que deserializar la cadena a un Type es una solución mucho más robusta. –

8

Esto se llevará a JSON y convertirlo en una clase con establecimiento inflexible de los cuales se especifica (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; 
      } 
     } 

Esto tomará una clase y serializarlo como 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: En el primer ejemplo necesitará tener una clase de respaldo para especificar qué tipo es T. Así que si usted le dijo que que T es de tipo User que tendría que haber especificado esta parte:

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

¿Valdría la pena construir * un * objeto 'DataContractJsonSerializer' (por tipo serializable) en lugar de construyendo uno nuevo para cada serialización? – Timwi

+0

@Timwi, depende. Te va a costar más memoria retener las instancias, pero será menos económico si no lo haces. Realmente se reduce a tu situación específica. Lo ideal es mantener los serializadores que se usarán con frecuencia y desechar los que no. –

Cuestiones relacionadas