があります。 JSON-Format unterstützt von Haus aus keine Binärdaten. Die binären Daten müssen escaped werden, damit sie in ein String-Element (d. h. null oder mehr Unicode-Zeichen in Anführungszeichen mit Backslash-Escapes) in JSON eingefügt werden können.
Eine offensichtliche Methode zur Entschlüsselung von Binärdaten ist die Verwendung von Base64. Base64 ist jedoch mit einem hohen Verarbeitungsaufwand verbunden. Außerdem werden 3 Bytes in 4 Zeichen expandiert, was zu einer Erhöhung der Datengröße um etwa 33 % führt.
Ein Anwendungsfall hierfür ist der Entwurf v0.8 des Spezifikation der CDMI-Wolkenspeicher-API . Sie erstellen Datenobjekte über einen REST-Webservice unter Verwendung von JSON, z.B.
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=",
}
Gibt es bessere Möglichkeiten und Standardmethoden zur Kodierung von Binärdaten in JSON-Strings?
51 Stimmen
Für den Upload: Sie machen es nur einmal, also ist es keine große Sache. Für den Download: Sie werden überrascht sein, wie gut base64 komprimiert unter gzip Wenn Sie also gzip auf Ihrem Server aktiviert haben, ist das wahrscheinlich auch in Ordnung.
6 Stimmen
Eine weitere würdige Lösung msgpack.org für die Hardcore-Nerds: github.com/msgpack/msgpack/blob/master/spec.md
6 Stimmen
@cloudfeet, Einmal pro Benutzer pro Aktion . Eine sehr große Sache.
8 Stimmen
Beachten Sie, dass die Zeichen in der Regel 2 Bytes Speicher jede. So könnte base64 +33% (4/3) Overhead auf der Leitung verursachen, aber die Daten auf die Leitung zu bringen, sie abzurufen und zu nutzen, würde erfordern eine +166%ige (8/3) Overhead . Ein Beispiel: Wenn eine Javascript-Zeichenkette eine maximale Länge von 100k Zeichen hat, können Sie mit base64 nur 37,5k Bytes an Daten darstellen, nicht 75k Bytes an Daten. Diese Zahlen können in vielen Teilen der Anwendung einen Engpass darstellen, z. B.
JSON.parse
usw. ......0 Stimmen
....... Diese Zahlen stehen im Gegensatz zu den Einsparungen, die Sie erzielen können, wenn Sie die binären Rohdaten in Codepoints konvertieren und diese Codepoints dann in UTF-8 umwandeln. Selbst eine einfache Konvertierung unter Verwendung der Kodierung für Codepoints
0x00
a0xff
würde sich im Durchschnitt ein Aufwand von nur +50%) . und ................0 Stimmen
................. Konvertierung unter Verwendung der Kodierung für Codepoints
0x00
a0xffff
ergibt sich ein durchschnittlicher Overhead von ~48.5% . Konvertierung unter Verwendung der Kodierung für Codepoints0x00
a0x10ffff
im Durchschnitt zu Gemeinkosten von 39.8% . Das sind 71,5k Bytes an Daten, die Sie mit 100k Zeichen darstellen können, anstatt der 37,5k Bytes von base64.11 Stimmen
@Pacerier "typischerweise 2 Byte Speicher [pro Zeichen]" ist nicht korrekt. v8 hat zum Beispiel OneByte und TwoByte Strings. Zwei-Byte-Zeichenfolgen werden nur dort verwendet, wo es notwendig ist, um einen grotesken Speicherverbrauch zu vermeiden. Base64 ist mit Ein-Byte-Zeichenfolgen kodierbar.