バイナリ入りのデータをブラウザに返すためにJSONではなくBSONを使う

 以前にJSONにJPEGをbase64エンコードして入れてみた。だけどgzipとかで転送データ量を減らす工夫がされてる昨今で、データ量が肥大化するbase64エンコードを使うのがいただけないとひっかかっていた。なのでBSONを触ってみる。

 BSONでのHelloWorldは下記参照。公式のサンプル。
{"hello": "world"}

\x16\x00\x00\x00 // total document size
\x02 // 0x02 = type String
hello\x00 // field name
\x06\x00\x00\x00world\x00 // field value
\x00 // 0x00 = type EOO ('end of object')


 今回は手っ取り早く試したいのでPythonを使う。BSONドキュメントはPyMongo付属のものを使う。なのでPyMongoをインストール。
pip install pymongo

 BSONドキュメントを作るサンプル。
import collections

import bson


jpg_data = b"\xFF\xD8\xDD\xE0"


bson_doc = bson.BSON.encode({"jpg": jpg_data})
print(bson_doc)

 これはbase64エンコードのような数十パーセントのデータ量肥大化をしておらず、ドキュメントへのデータ一件追加につき10バイト程度で済んでいる。こっちのほうがbase64エンコードでJSONに入れるよりデータ量では合理的。

 ブラウザ側でBSONのオブジェクト化もライブラリを使えば一行。
https://github.com/mongodb/js-bson
comment: 0