2010-05-10 21 views
9

Tengo algunos objetos .NET simples que me gustaría serializar a JSON y viceversa. El conjunto de objetos a serializar es bastante pequeño y yo controlo la implementación, por lo que no necesito una solución genérica que funcione para todo. Debido a que mi ensamblado se distribuirá como una biblioteca, me gustaría evitar la dependencia de algunas DLL de terceros: solo quiero dar a los usuarios un ensamblaje al que puedan hacer referencia.Serialización JSON realmente simple en .NET

He leído las otras preguntas que pude encontrar sobre la conversión desde y hacia JSON en .NET. La solución recomendada de JSON.NET funciona, por supuesto, pero requiere distribuir una DLL adicional.

No necesito ninguna de las características de JSON.NET. Solo necesito manejar un objeto simple (o incluso un diccionario) que contenga cadenas, enteros, DateTimes y matrices de cadenas y bytes. Al deserializar, me complace recuperar un diccionario; no es necesario volver a crear el objeto.

¿Hay algún código realmente simple que pueda compilar en mi ensamblado para hacer este trabajo simple?

También he intentado System.Web.Script.Serialization.JavaScriptSerializer, pero donde se cae es la matriz de bytes: quiero basar-64 codificar e incluso registrar un convertidor no me permite lograrlo fácilmente debido a la forma en que funciona la API (no pasa en el nombre del campo).

+1

Ha considerado el uso [ILMerge] (http://research.microsoft.com/en-us/people/mbarnett/ilmerge.aspx) para incrustar JSON.NET en su ensamblado? –

+0

No, pero gracias por señalarlo a mí. Creo que podría ser excesivo para esto, pero parece una herramienta muy interesante y consideraré usarlo para otra cosa en la que estoy trabajando. +1 – EMP

+1

Si los datos JSON contienen una cadena, probablemente valga la pena utilizar un paquete como JSON.NET para manejarlo, en lugar de hacer el suyo. Por ejemplo, ¿cómo manejas espacios en tus cadenas? ¿O comillas simples/dobles en la cadena? Newlines? –

Respuesta

4

Json.NET tiene licencia MIT, puede simplemente descargar la fuente e incluir solo aquellos archivos que necesita para su aplicación.

+0

Terminé trabajando sobre el tema en 'System.Web.Script.Serialization.JavaScriptSerializer', pero acepté esto, porque probablemente sea lo que haría. – EMP

+0

@Evgeny - ¿Puede explicarnos un poco más acerca de cómo trabajó con este problema de codificación de la matriz de bytes? Tengo el mismo problema y preferiría evitar el uso de una biblioteca de terceros como JSON.net si es posible. – InSane

+0

@InSane. Por desgracia, no recuerdo en este momento y ya no tengo acceso a ese código. Es posible que simplemente haya codificado 64-base la matriz yo mismo dentro del objeto o terminé usando un convertidor con un subcampo, vea la respuesta que acabo de publicar. – EMP

4

Una posible solución alternativa que permite el uso del marco .NET JavaScriptSerializer es registrar un convertidor que codifica base 64 matrices de bytes en un sub-campo, así:

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() }); 
Cuestiones relacionadas