serialize serializar example deserialize array and c# json deserialization javascriptserializer

c# - example - Deserializar un archivo JSON con JavaScriptSerializer()



serializar json c# (6)

la estructura del archivo json que deserializará se ve a continuación;

{ "id" : "1lad07", "text" : "test", "url" : "http:////twitpic.com//1lacuz", "width" : 220, "height" : 84, "size" : 8722, "type" : "png", "timestamp" : "Wed, 05 May 2010 16:11:48 +0000", "user" : { "id" : 12345, "screen_name" : "twitpicuser" } }

He creado una clase que tiene los nombres archivados como propiedades para JavaScriptSerializer. El código que usaré para Deserializar el json es el siguiente;

using (var reader = new StreamReader(twitpicResponse.GetResponseStream())) { var responseBody = reader.ReadToEnd(); var deserializer = new JavaScriptSerializer(); var results = deserializer.Deserialize<Response>(responseBody); }

Mi problema es cómo puedo leer el campo de usuario en el archivo json. que es como abajo;

"user" : { "id" : 12345, "screen_name" : "twitpicuser" }

Tiene sub propiedades y valores. ¿Cómo puedo nombrarlos en mi clase de Respuesta? mi clase de respuesta ahora es así;

public class Response { public string id { get; set; } public string text { get; set; } public string url { get; set; } public string width { get; set; } public string height { get; set; } public string size { get; set; } public string type { get; set; } public string timestamp { get; set; } }

¿Cuál es el mejor caso para hacerlo?


  1. Debe crear una clase que contenga los valores de usuario, al igual que la clase de respuesta User .
  2. Agregue una propiedad a la clase de Respuesta ''usuario'' con el tipo de la nueva clase para los valores de usuario User .

    public class Response { public string id { get; set; } public string text { get; set; } public string url { get; set; } public string width { get; set; } public string height { get; set; } public string size { get; set; } public string type { get; set; } public string timestamp { get; set; } public User user { get; set; } } public class User { public int id { get; set; } public string screen_name { get; set; } }

En general, debe asegurarse de que los tipos de propiedad de json y sus clases CLR coincidan. Parece que la estructura que está intentando deserializar contiene múltiples valores numéricos (lo más probable es que int ). No estoy seguro de si JavaScriptSerializer es capaz de deserializar números en campos de cadenas automáticamente, pero debe intentar hacer coincidir su tipo de CLR lo más cerca posible de los datos reales.


Cree un usuario de subclase con un campo de id y un campo screen_name, como este:

public class User { public string id { get; set; } public string screen_name { get; set; } } public class Response { public string id { get; set; } public string text { get; set; } public string url { get; set; } public string width { get; set; } public string height { get; set; } public string size { get; set; } public string type { get; set; } public string timestamp { get; set; } public User user { get; set; } }


Para .Net 4+:

string s = "{ /"user/" : { /"id/" : 12345, /"screen_name/" : /"twitpicuser/"}}"; var serializer = new JavaScriptSerializer(); dynamic usr = serializer.DeserializeObject(s); var UserId = usr["user"]["id"];

Para .Net 2 / 3.5: este código debería funcionar en JSON con 1 nivel

samplejson.aspx

<%@ Page Language="C#" %> <%@ Import Namespace="System.Globalization" %> <%@ Import Namespace="System.Web.Script.Serialization" %> <%@ Import Namespace="System.Collections.Generic" %> <% string s = "{ /"id/" : 12345, /"screen_name/" : /"twitpicuser/"}"; var serializer = new JavaScriptSerializer(); Dictionary<string, object> result = (serializer.DeserializeObject(s) as Dictionary<string, object>); var UserId = result["id"]; %> <%=UserId %>

Y para un JSON de 2 niveles:

muestra2.aspx

<%@ Page Language="C#" %> <%@ Import Namespace="System.Globalization" %> <%@ Import Namespace="System.Web.Script.Serialization" %> <%@ Import Namespace="System.Collections.Generic" %> <% string s = "{ /"user/" : { /"id/" : 12345, /"screen_name/" : /"twitpicuser/"}}"; var serializer = new JavaScriptSerializer(); Dictionary<string, object> result = (serializer.DeserializeObject(s) as Dictionary<string, object>); Dictionary<string, object> usr = (result["user"] as Dictionary<string, object>); var UserId = usr["id"]; %> <%= UserId %>


Suponiendo que no quiera crear otra clase, siempre puede dejar que el deserializador le dé un diccionario de pares de valores-clave, como por ejemplo:

string s = //{ "user" : { "id" : 12345, "screen_name" : "twitpicuser"}}; var serializer = new JavaScriptSerializer(); var result = serializer.DeserializeObject(s);

Recuperarás algo, donde podrás hacer:

var userId = int.Parse(result["user"]["id"]); // or (int)result["user"]["id"] depending on how the JSON is serialized. // etc.

Mira el result en el depurador para ver, lo que hay allí.


public class User : List<UserData> { public int id { get; set; } public string screen_name { get; set; } } string json = client.DownloadString(url); JavaScriptSerializer serializer = new JavaScriptSerializer(); var Data = serializer.Deserialize<List<UserData>>(json);


//Page load starts here var json = new System.Web.Script.Serialization.JavaScriptSerializer().Serialize(new { api_key = "my key", action = "categories", store_id = "my store" }); var json2 = "{/"api_key/":/"my key/",/"action/":/"categories/",/"store_id/":/"my store/",/"user/" : {/"id/" : 12345,/"screen_name/" : /"twitpicuser/"}}"; var list = new System.Web.Script.Serialization.JavaScriptSerializer().Deserialize<FooBar>(json); var list2 = new System.Web.Script.Serialization.JavaScriptSerializer().Deserialize<FooBar>(json2); string a = list2.action; var b = list2.user; string c = b.screen_name; //Page load ends here public class FooBar { public string api_key { get; set; } public string action { get; set; } public string store_id { get; set; } public User user { get; set; } } public class User { public int id { get; set; } public string screen_name { get; set; } }