はじめに
JSONは、広く普及しているデータ交換形式です。 その優雅さ、処理の容易さ、および比較的豊富な型システムは、システム間でデータを迅速かつ簡単に保存またはランダムに転送する必要がある多くの開発者にとって自然な選択肢になりました。
残念ながら、ネットワーク上での送信に適したデータのテキスト表現を使用して、プログラミング言語でネイティブ構造をパックおよびアンパックするプロセスには、多大なリソースコストがかかります。 負荷の高いシステムでは、 JSON形式のテキスト処理ステップを回避することで、処理時間の情報をより高く、より良くし、保存するデータのサイズを小さくすることができます。
このような場合により良い結果を得るには、バイナリJSON形式を使用すると便利です 。
なんで?
JSONをより速く、 BSON 、 BJSON、またはSmileなどのバイナリ仕様でより速く使用しようとする試みは存在しますが、次の2つの理由で失敗します。
- 内部データ型 。 バイナリ形式のみに固有であり、もともとJSON標準に含まれていなかった内部データ型を使用すると、上記の仕様は実装に応じて異なるように解釈される可能性があるため、広く使用するには不適切です。
- 実装の複雑さ 。 一部の形式ではパフォーマンスが向上しますが、他の形式では、より複雑でわかりにくい仕様のため、よりコンパクトなプレゼンテーションが提供されます。 その結果、配布と実装が遅くなるか、不可能になります。 使いやすさがJSONの成功のエンジンです。
たとえば、 BSONは、正規表現、JavaScriptコードのブロック、およびJSONに対応するデータ型を持たないその他の構成要素のデータ型を定義します 。 また、 BJSONはそのデータ型を定義し、2つの異なる実装での型の解釈に関連するエラーのための十分な余地を残しています。 Smileは、より複雑なデータタイプ、効率的にスペースを使用するための生成と解析のルールを定義します。
既存のバイナリJSON仕様はすべて、非互換性と実装の難点に悩まされています 。これは、 JSONの主な利点を自然に台無しにします 。
JSONのシンプルさにより、さまざまなプログラミング言語で実装を作成できるようになり、データを直接使用する人にとってすぐに便利で理解しやすくなりました。
成功したバイナリJSON仕様は、コミュニティ全体で真に役立つために、これらのプロパティを採用する必要があります 。
JSON + gzipを使用しない理由
JSON圧縮は、バイナリ形式を使用するよりも優れたソリューションです。 しかし、2つの問題があります。
送信データのサイズは平均75%削減できますが、同時に処理のオーバーヘッドが大幅に増加することがわかります。
目標
ユニバーサルバイナリJSON仕様は、 JSONとの完全な互換性、シンプルさ、速度、わかりやすさの原則に基づいて設計されています 。 この形式での読み取りと書き込みは簡単です。 副作用として-データが占めるスペースを平均30%削減します。
- 完全な互換性 。 すべての最新のプログラミング言語でサポートされている100% JSON互換性とデータ型の排他的使用。 これにより、開発者がプログラミング言語でサポートされていない複雑なデータ構造を使用しなくても、 JSONとユニバーサルバイナリJSONの間でデータを効率的に変換できます。
- 使いやすさ 。 これは、 JSON仕様が基礎として使用され、タイプの合理的な記述に使用されるバイナリ構造が1つだけであるという事実により実現されます。 これにより、開発者による可用性と理解の容易さが得られます。
- スピードと効率 。 バイナリ形式を使用する動機は、データ解析の速度と効率です。 同時に、副作用として、スペース消費量が30%減少します。
データ形式
サポートされているすべてのタイプを記述するために使用される仕様のシングルバイト構造の一般的なビュー
[タイプ、1バイト文字]([長さ、1または4バイト整数])([データ])
- タイプ -1バイト、ASCII文字。 それに続くデータのタイプを示すために使用されます。
- length (オプション) -オブジェクトの長さまたはサイズに応じて1または4バイト(整数値)。 配列の場合、その長さ。 オブジェクトの場合、キー/値のペアの数。 要素の長さまたは数が0から254までの場合、1バイトが使用されます。 値が255のこのフィールドは、長さが不明なオブジェクトおよび配列用に予約されています。
- データ (オプション) -オブジェクトのデータを直接表すバイトシーケンス。
データ型に応じて、 長さとデータのフィールドが使用されるか使用されません。 たとえば、タイプ32ビット整数の標準サイズは4バイトです。 このタイプの値を書き込むには、タイプを示す1バイトと値自体に4バイトが必要です。 この場合、 長さフィールドは無用のため使用されません。
この情報の提示のおかげで、目標は達成されました。
特徴
Universal Binary JSON仕様は以下をサポートします。
- 基本的なデータ型
- 配列
- オブジェクト
- 長さまたはサイズが不明な整数、配列、およびオブジェクト
- データストリーミング
重要な機能 :数値型の値は、 高から低( ビッグエンディアン )のバイト順で書き込まれ、テキスト情報の主なエンコードはUTF-8です。
コミュニティ
- UBJSON仕様の公式Webサイト - ユニバーサルバイナリJSON
- 参加して議論した
- Java実装- ユニバーサルバイナリJSON Javaライブラリ
- C#での簡単な実装-Ubjson.NET
他のプログラミング言語での実装は、このリンクに表示されるとおりに利用可能になります。
PS: Javaでの仕様と実装の著者であるRiyad Kallaと私、C#での記事と実装の著者である私たちは、仕様に取り組むプロセスに皆さんが参加することを嬉しく思います。