514 votos

Los datos binarios en Cadena JSON. Algo mejor que Base64

El formato JSON de forma nativa no admite datos binarios. Los datos binarios se ha escapado de modo que pueda ser colocado en un elemento de cadena (es decir. cero o más caracteres Unicode en comillas dobles usando la barra invertida se escapa) en JSON.

Métodos evidentes para escapar de datos binarios para uso en Base64. Sin embargo, en Base64 tiene una alta carga de procesamiento. También se amplía de 3 bytes a 4 personajes, lo que lleva a un aumento del tamaño de los datos alrededor de un 33%.

Un caso de uso esta es la v0.8 proyecto de la CDMI de almacenamiento en la nube especificación de API. Crear objetos de datos a través de un RESTO-Webservice utilizando 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 los datos binarios en las cadenas JSON?

388voto

hobbs Puntos 71946

Hay 94 caracteres Unicode que puede ser representada como un byte de acuerdo a la JSON spec (si su JSON es transmitida como UTF-8). Con esto en mente, creo que lo mejor que puede hacer el espacio-sabio es base85 que representa cuatro bytes de cinco caracteres. Sin embargo, este es sólo un 7% de mejora sobre base64, es más caro para calcular, y sus implementaciones son menos comunes que los de base64, así que probablemente no sea un triunfo.

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

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

32voto

DarcyThomas Puntos 352

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

Edit: FYI la biblioteca NET json.net soporta la lectura y la escritura bson si usted está buscando un poco de C # lado del servidor amor.

18voto

andrej Puntos 702

Si usted se ocupa de los problemas de ancho de banda, tratar de comprimir los datos en el lado del cliente en primer lugar, a continuación, base64-it.

Bonito ejemplo de esa magia está en http://jszip.stuartk.co.uk/ y más discusión de este tema está en implementación de JavaScript de Gzip

17voto

richardtallent Puntos 17534

yEnc podría funcionar para usted:

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

9voto

Stefano Fratini Puntos 51

Formato Sonrisa

Es muy rápido para codificar, decodificar y compacto

Comparación de velocidad (basado en java, pero sin embargo significativo): https://github.com/eishay/jvm-serializers/wiki/

También es una extensión JSON que le permiten saltarse la codificación base64 para matrices de bytes

Cuerdas Sonrisa codificado pueden 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: