ASP .NET fornisce un oggetto con cui è possibile serializzare/deserializzare oggetti secondo lo standard JSON, il DataContractJsonSerlializer. Esso è contenuto nel namespace System.Runtime.Serialization.Json, ma per utilizzarlo si deve aggiungere al proprio progetto un riferimento all'assembly System.ServiceModel.Web.dll.
Ogni classe o struttura che si vuole serializzare deve essere decorata con l'attributo DataContract; al suo interno, i membri che interessano devono avere l'attributo DataMember. Ad esempio:
[DataContract]
public class ShoppingCart
{
[DataMember]
public List<string> Articles { get; set; }
[DataMember]
public string UserName { get; set; }
public ShoppingCart()
{
Articles = new List<string>();
}
}
Fatto questo, l'utilizzo del DataContractJSonSerializer è molto semplice, dal momento che esso si comporta come un serializzatore standard. Le seguenti funzioni generiche consentono di serializzare e deserializzare un qualunque oggetto:
public string Serialize<T>(T obj)
{
DataContractJsonSerializer serializer =
new DataContractJsonSerializer(obj.GetType());
using (MemoryStream ms = new MemoryStream())
{
serializer.WriteObject(ms, obj);
return Encoding.Default.GetString(ms.ToArray());
}
}
public T Deserialize<T>(string json)
{
T obj = Activator.CreateInstance<T>();
using (MemoryStream ms = new MemoryStream(Encoding.Unicode.GetBytes(json)))
{
DataContractJsonSerializer serializer =
new DataContractJsonSerializer(obj.GetType());
obj = (T)serializer.ReadObject(ms);
return obj;
}
}
Ad esempio, utilizzando la classe ShoppingCart definita sopra:
ShoppingCart cart = new ShoppingCart();
cart.UserName = "Marco";
cart.Articles.Add("Fiat 500");
cart.Articles.Add("Mini");
//Serializza l'oggetto.
string json = Serialize(cart);
//Deserializza l'oggetto.
ShoppingCart cart2 = Deserialize<ShoppingCart>(json);
Una cosa che ho trovato molto interessante è che questo oggetto supporta di default la serializzazione degli oggetti List<T>, che invece l'XmlSerializer non gestisce.