514 votos

Datos binarios en la cadena JSON. Algo mejor que la Base64

El El formato JSON nativamente no soporta datos binarios. Los datos binarios tienen que ser escapados para que puedan ser colocados en un elemento de cadena (es decir, cero o más caracteres Unicode entre comillas dobles usando escapes de barra invertida) en JSON.

Un método obvio para escapar de los datos binarios es usar Base64. Sin embargo, Base64 tiene una alta carga de procesamiento. También expande 3 bytes en 4 caracteres lo que lleva a un aumento del tamaño de los datos de alrededor del 33%.

Un caso de uso para esto es el borrador v0.8 del Especificación de la API de almacenamiento en la nube de CDMI . Creas objetos de datos a través de un REST-Webservice usando JSON, por ejemplo.

PUT /MyContainer/BinaryObject HTTP/1.1
Host: cloud.example.com
Accept: application/vnd.org.snia.cdmi.dataobject+json
Content-Type: application/vnd.org.snia.cdmi.dataobject+json
X-CDMI-Specification-Version: 1.0
{
    "mimetype" : "application/octet-stream”,
    "metadata" : [ ],
    "value" :   "TWFuIGlzIGRpc3Rpbmd1aXNoZWQsIG5vdCBvbmx5IGJ5IGhpcyByZWFzb24sIGJ1dCBieSB0aGlz
    IHNpbmd1bGFyIHBhc3Npb24gZnJvbSBvdGhlciBhbmltYWxzLCB3aGljaCBpcyBhIGx1c3Qgb2Yg
    dGhlIG1pbmQsIHRoYXQgYnkgYSBwZXJzZXZlcmFuY2Ugb2YgZGVsaWdodCBpbiB0aGUgY29udGlu
    dWVkIGFuZCBpbmRlZmF0aWdhYmxlIGdlbmVyYXRpb24gb2Yga25vd2xlZGdlLCBleGNlZWRzIHRo
    ZSBzaG9ydCB2ZWhlbWVuY2Ugb2YgYW55IGNhcm5hbCBwbGVhc3VyZS4=",
}

¿Hay mejores formas y métodos estándar para codificar datos binarios en cadenas JSON?

388voto

hobbs Puntos 71946

Hay 94 caracteres Unicode que pueden ser representados como un byte de acuerdo con la especificación JSON (si su JSON es transmitido como UTF-8). Con eso en mente, creo que lo mejor que puedes hacer en el espacio es base85 que representa cuatro bytes como cinco caracteres. Sin embargo, esto es sólo un 7% de mejora sobre la base64, es más caro de computar, y las implementaciones son menos comunes que para la base64, así que probablemente no es una victoria.

También podría simplemente asignar cada byte de entrada al carácter correspondiente en U+0000-U+00FF, y luego hacer la codificación mínima requerida por el estándar JSON para pasar esos caracteres; la ventaja aquí es que la decodificación requerida es nula más allá de las funciones incorporadas, pero la eficiencia espacial es mala -- una expansión del 105% (si todos los bytes de entrada son igualmente probables) vs. 25% para base85 o 33% para base64.

Veredicto final: base64 gana, en mi opinión, sobre la base de que es común, fácil y no malo suficiente para garantizar el reemplazo.

32voto

DarcyThomas Puntos 352

BSON (Binary JSON) puede trabajar para usted. http://en.wikipedia.org/wiki/BSON

Editar: Para tu información, la biblioteca .NET json.net apoya la lectura y la escritura bson si estás buscando algo de amor de lado del servidor C#.

18voto

andrej Puntos 702

Si tienes problemas de ancho de banda, trata de comprimir los datos en el lado del cliente primero, y luego en base64-it.

Un buen ejemplo de este tipo de magia se encuentra en http://jszip.stuartk.co.uk/ y más discusión sobre este tema está en Implementación de JavaScript de Gzip

17voto

richardtallent Puntos 17534

YEnc podría funcionar para ti:

http://en.wikipedia.org/wiki/Yenc

9voto

Stefano Fratini Puntos 51

El formato de la sonrisa

Es muy rápido para codificar, decodificar y compactar

Comparación de velocidad (basada en Java pero significativa, sin embargo): https://github.com/eishay/jvm-serializers/wiki/

También es una extensión de JSON que te permite saltar la codificación de la base64 para las matrices de bytes.

Las cadenas codificadas de sonrisas pueden ser comprimidas cuando el espacio es crítico.

Iteramos.com

Iteramos es una comunidad de desarrolladores que busca expandir el conocimiento de la programación mas allá del inglés.
Tenemos una gran cantidad de contenido, y también puedes hacer tus propias preguntas o resolver las de los demás.

Powered by:

X