2010-05-10 6 views
9

J'ai quelques objets .NET simples que je voudrais sérialiser en JSON et vice-versa. L'ensemble des objets à sérialiser est assez petit et je contrôle l'implémentation, donc je n'ai pas besoin d'une solution générique qui fonctionnera pour tout. Étant donné que mon assembly sera distribué en tant que bibliothèque, je voudrais vraiment éviter une dépendance sur certaines DLL tierces: je veux juste donner aux utilisateurs une assemblée à laquelle ils peuvent se référer.Sérialisation JSON très simple dans .NET

J'ai lu les autres questions que je pourrais trouver sur la conversion de et vers JSON dans .NET. La solution recommandée de JSON.NET fonctionne, bien sûr, mais elle nécessite la distribution d'une DLL supplémentaire.

Je n'ai besoin d'aucune fonctionnalité de JSON.NET. J'ai juste besoin de gérer un objet simple (ou même un dictionnaire) qui contient des chaînes, des entiers, des DateTimes et des tableaux de chaînes et d'octets. Lors de la désérialisation, je suis heureux de retrouver un dictionnaire - il n'a pas besoin de créer à nouveau l'objet.

Existe-t-il un code vraiment simple que je pourrais compiler dans mon assemblage pour faire ce travail simple?

J'ai également essayé System.Web.Script.Serialization.JavaScriptSerializer, mais là où il tombe, c'est le tableau d'octets: je veux encoder en base64 et même enregistrer un convertisseur ne me permet pas de le faire facilement en raison du fonctionnement de l'API (il ne passe pas au nom du champ).

+1

Avez-vous pensé à utiliser [ILMerge] (http://research.microsoft.com/en-us/people/mbarnett/ilmerge.aspx) pour intégrer JSON.NET dans votre assembly? –

+0

Non, mais merci de me l'avoir fait remarquer. Je pense que cela pourrait être exagéré pour cela, mais cela ressemble à un outil très intéressant et je vais envisager de l'utiliser pour quelque chose d'autre sur lequel je travaille. +1 – EMP

+1

Si les données JSON contiennent une chaîne, il vaut probablement la peine d'utiliser un paquetage comme JSON.NET pour le gérer, plutôt que de rouler le vôtre. Par exemple, comment gérez-vous les espaces dans vos chaînes? Ou des guillemets simples/doubles dans la chaîne? Newlines? –

Répondre

4

Json.NET est une licence MIT, vous pouvez simplement télécharger la source et inclure uniquement les fichiers dont vous avez besoin pour votre application.

+0

J'ai fini par contourner le problème dans 'System.Web.Script.Serialization.JavaScriptSerializer', mais en acceptant cela, car c'est probablement ce que je ferais autrement. – EMP

+0

@Evgeny - Pouvez-vous élaborer un peu sur la façon dont vous avez travaillé autour de ce problème d'encodage du tableau d'octets? J'ai le même problème et préfère éviter d'utiliser une bibliothèque tierce comme JSON.net si possible – InSane

+0

@InSane malheureusement je ne me souviens pas à ce stade et n'ai plus accès à ce code. J'ai peut-être simplement codé en base-64 le tableau moi-même à l'intérieur de l'objet ou j'ai fini par utiliser un convertisseur avec un sous-champ - voir la réponse que je viens de poster. – EMP

4

Une solution possible qui permet d'utiliser le framework .NET JavaScriptSerializer est d'enregistrer un convertisseur de base 64 code des tableaux d'octets dans un sous-champ, comme celui-ci:

class ByteArrayBase64Converter : JavaScriptConverter 
{ 
    public override object Deserialize(IDictionary<string, object> dictionary, Type type, JavaScriptSerializer serializer) 
    { 
     return Convert.FromBase64String((string)dictionary["b64"]); 
    } 

    public override IDictionary<string, object> Serialize(object obj, JavaScriptSerializer serializer) 
    { 
     return new Dictionary<string, object> { { "b64", Convert.ToBase64String((byte[])obj) } }; 
    } 

    public override IEnumerable<Type> SupportedTypes 
    { 
     get { return new[] { typeof(byte[])}; } 
    } 
} 


var serializer = new JavaScriptSerializer(); 
serializer.RegisterConverters(new JavaScriptConverter[] { new ByteArrayBase64Converter() });