Вы находитесь на странице: 1из 3

JSON Serializacin y deserializacin en Silverlight

JSON (JavaScript Object Notation) es usado como una alternativa de XML. Ejemplo de una estructura de un archivo JSON:

Objeto simple

{ "Nombre":"Martin", "Apellido":"Mihaylov" }
Mltiples objetos (Arreglo)

[ { "Nombre":"Janin", "Apellido":"Medina" }, { "Nombre":"David", "Apellido":"Olvera" } ]

Serializacin
En .NET existe una clase llamada DataContractJsonSerializer que sirve para serializar y deserealizar archivos JSON. Para poder usar la clase es necesario agregar a las referencias System.ServiceModel.Web a pesar de System.Runtime.Serialization.Json. Antes de comenzar con la Serializacin se debe crear una clase que se pueda serializar a JSON.

[DataContract] public class Person { [DataMember] public string Nombre { get; set; } [DataMember] public string Apellido { get; set; } }

Con el fin de ser serializable con DataContractJsonSerializer tenemos que establecer un atributo [DataContract]. Las propiedades que utilizaremos para serializar deben tener [DataMember] atributos. NOTA: Tambin se pueden establecer ObservableCollection en lugar de usar List, usando ObservableCollection no es necesario agregar atributos [DataContract] ni [DataMember]. NOTA: Para usar estos atributos se debe agregar la referencia System.Runtime.Serialization. Ahora podemos comenzar con la Serializacin. Para lo cual creamos un mtodo que tome nuestro objeto como argumento y retorne un string en formato JSON.
public static string SerializeToJsonString( object objectToSerialize ) { using( MemoryStream ms = new MemoryStream() ) { DataContractJsonSerializer serializer = new DataContractJsonSerializer( objectToSerialize.GetType() ); serializer.WriteObject( ms, objectToSerialize ); ms.Position = 0; using( StreamReader reader = new StreamReader( ms ) ) { return reader.ReadToEnd(); } } }

Creamos un objeto de tipo DataContractJsonSerializer y en el constructor establecemos el tipo que se va a serializar. Luego utilizamos el mtodo WriteObject y nuestro objeto es serializado y escrito en un Stream. Despues de usar un StreamReader para leer el Stream tenemos nuestro string JSON.

Deserializacin
Ahora vamos a deserializar un objeto de tipo Person. Para lo cual creamos el siguiente mtodo:
public static Person DeserializeToPerson( string jsonString ) { using( MemoryStream ms = new MemoryStream( Encoding.Unicode.GetBytes( jsonString ) ) ) { DataContractJsonSerializer serializer = new DataContractJsonSerializer( typeof( Person ) ); return ( Person )serializer.ReadObject( ms ); } }

Creamos un Stream de nuestro string JSON y lo pasamos al mtodo ReadObject del serializador. Y nuestro objeto es deserializado. Si quisiramos deserializar una lista de objetos , se hace de la misma manera
public static List<Person> DeserializeToListOfPersons( string jsonString ) { using( MemoryStream ms = new MemoryStream( Encoding.Unicode.GetBytes( jsonString ) ) ) { DataContractJsonSerializer serializer = new DataContractJsonSerializer( typeof( List<Person> ) ); return ( List<Person> )serializer.ReadObject( ms ); } }

Lo nico diferente es el tipo.

Podemos tener un solo mtodo y volver a usarlo con independencia del tipo? Si, podemos utilizar un mtodo de la plantilla. El mtodo quedara:
public static T Deserialize<T>( string jsonString ) { using( MemoryStream ms = new MemoryStream( Encoding.Unicode.GetBytes( jsonString ) ) ) { DataContractJsonSerializer serializer = new DataContractJsonSerializer( typeof( T ) ); return ( T )serializer.ReadObject( ms ); } }

T es un argumento de tipo y lo usamos para hacer que el mtodo independiente del tipo. Cuando llegamos al mtodo podemos especificar.
List<Person> persons = Deserialize<List<Person>>( jsonString )

Вам также может понравиться