【发布时间】:2010-11-29 09:55:14
【问题描述】:
JSON format 本身不支持二进制数据。必须对二进制数据进行转义,以便可以将其放入 JSON 中的字符串元素(即使用反斜杠转义的双引号中的零个或多个 Unicode 字符)。
转义二进制数据的一个明显方法是使用 Base64。但是,Base64 的处理开销很高。此外,它将 3 个字节扩展为 4 个字符,这导致数据大小增加了约 33%。
这方面的一个用例是CDMI cloud storage API specification 的 v0.8 草案。您可以使用 JSON 通过 REST-Webservice 创建数据对象,例如
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=",
}
有没有更好的方法和标准的方法将二进制数据编码成 JSON 字符串?
【问题讨论】:
-
上传:你只做一次,所以没什么大不了的。对于下载,您可能会对 base64 compresses under gzip 的性能感到惊讶,因此如果您在服务器上启用了 gzip,您也可能没问题。
-
对于铁杆书呆子的另一个有价值的解决方案msgpack.org:github.com/msgpack/msgpack/blob/master/spec.md
-
@cloudfeet,每个用户每个操作一次。非常重要。
-
请注意,每个字符通常是 2 字节的内存。因此,base64 可能会在线路上产生 +33% (4/3) 的开销,但将数据放在线路上、检索并利用它,将需要 +166% (8/3 ) 开销。恰当的例子:如果 Javascript 字符串的最大长度为 100k 字符,则使用 base64 只能表示 37.5k 字节的数据,而不是 75k 字节的数据。这些数字可能是应用程序许多部分的瓶颈,例如
JSON.parse等...... -
@Pacerier“通常 2 个字节的内存 [每个字符]”不准确。例如 v8 有 OneByte 和 TwoByte 字符串。仅在必要时使用两字节字符串以避免怪异的内存消耗。 Base64 可以用一字节字符串编码。