(Dé)Sérialiser une réponse JSON en objet .Net de façon Générique
Pour le premier billet de ce blog dédié au développement, je ressort une classe que j'ai faite il y a quelques temps mais qui m'est très utiles.
Elle permet via la classe DataContractJsonSerializer apparu avec WCF dans le Framework 3.5 et contenu dans l'assembly System.ServiceModel.Web de sérialiser une réponse JSON (string) en un objet .Net de façon générique.
Pour cela on utilise le concept de paramètres de type, qui sera situé entre les "" :
public static T Deserialize(string jsonString)
Le T (on peut mettre ce que l'on veut) précisera donc le type du paramètre et pourra être utilisé dans le corps de la fonction et même en tant que type de renvoi de la fonction. Voici le code de cette classe qui finalement est très simple :
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.IO;
using System.Runtime.Serialization;
using System.Runtime.Serialization.Json;
using System.Net;
namespace PTiRouZ.Net.Api
{
///
/// Class permettant de convertir le code Json en objet .Net
///
public static class serializeTools
{
/// <summary>Déserialise une chaine Json en Object .Net</summary>
/// <typeparam name="T">Type de l'Objet .Net de sortie</typeparam>
/// <param name="jsonString">Chaine Json</param>
/// <returns>un objet .Net de type <typeparamref name="T"/></returns>
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);
}
}
/// <summary>Sérialise un Object .Net en une chaine Json</summary>
/// <typeparam name="T">Type de l'Objet .Net en entrée</typeparam>
/// <param name="ClassObject">Object .Net de Type <typeparamref name="T"/></param>
/// <returns>Une chaine Json</returns>
public static string Serialize<t>(T ClassObject)
{
using (MemoryStream ms = new MemoryStream())
{
DataContractJsonSerializer serializer = new DataContractJsonSerializer(typeof(T));
serializer.WriteObject(ms, ClassObject);
return Encoding.Default.GetString(ms.ToArray());
}
}
}
}Les objets .Net cible doivent implémenter des DataContract et DataMember situé dans l'assembly System.Runtime.Serialization qui permettront la(dé)sérialisation.
[DataContract]
public class site_albums
{
/// Identifiant de l'album
[DataMember]
public int id { get; set; }
/// nom de l'album
[DataMember]
public string name { get; set; }
}