4. CBOR と JSON 間でのデータ変換
このセクションは、CBOR と JSON の間の変換に関する非規範的な助言を与えます。コンバータの実装は、ここにある助言のうち望むものを自由に使用できます。
JSON テキストは文字のシーケンスであり、エンコードされたバイトのシーケンスではないのに対し、CBOR データ項目は文字ではなくバイトで構成されることは注目に値します。
4.1. CBOR から JSON への変換
CBOR の型のほとんどは JSON に直接対応するものがあります。しかし、一部には対応するものがなく、CBOR から JSON へのコンバータを実装する者は、それらの場合に何をすべきかを考慮する必要があります。以下の非規範的な助言は、それらを JSON の null のような単一の代替値に変換することで対処します。
-
整数 (主タイプ 0 または 1) は JSON の数値になります。
-
提案されるエンコーディングを指定するタグに埋め込まれていないバイト文字列 (主タイプ 2) は、パディングなしの base64url でエンコードされ、JSON の文字列になります。
-
UTF-8 文字列 (主タイプ 3) は JSON の文字列になります。JSON は特定の文字のエスケープを要求することに注意してください (RFC 4627、セクション 2.5): 引用符 (U+0022)、逆斜線 (U+005C)、および「C0 制御文字」(U+0000 から U+001F) です。他のすべての文字は変更されずに JSON の UTF-8 文字列にコピーされます。
-
配列 (主タイプ 4) は JSON の配列になります。
-
マップ (主タイプ 5) は JSON のオブジェクトになります。これは、すべてのキーが UTF-8 文字列である場合にのみ直接可能です。コンバータは他のキーを UTF-8 文字列に変換することもできます (整数をその 10 進表現を含む文字列に変換するなど)。ただし、そうするとキーの衝突の危険が生じます。
-
False (主タイプ 7、追加情報 20) は JSON の false になります。
-
True (主タイプ 7、追加情報 21) は JSON の true になります。
-
Null (主タイプ 7、追加情報 22) は JSON の null になります。
-
浮動小数点値 (主タイプ 7、追加情報 25 から 27) は、有限である (つまり JSON の数値で表現できる) 場合は JSON の数値になります。値が非有限 (NaN、または正もしくは負の Infinity) の場合は、代替値で表現されます。
-
その他のシンプル値 (主タイプ 7、まだ説明していない追加情報値) は、代替値で表現されます。
-
ビッグナム (主タイプ 6、タグ値 2 または 3) は、そのバイト文字列をパディングなしの base64url でエンコードして表現され、JSON の文字列になります。タグ値 3 (負のビッグナム) の場合、base エンコードされた値の前に "~" (ASCII チルダ) が挿入されます。(数値ではなくバイナリブロブに変換するのは、JSON デコーダーでの数値オーバーフローの可能性を防ぐためです。)
-
エンコーディングヒントを持つバイト文字列 (主タイプ 6、タグ値 21 から 23) は、説明されたとおりにエンコードされ、JSON の文字列になります。
-
他のすべてのタグ (主タイプ 6、その他のタグ値) については、埋め込まれた CBOR 項目が JSON 値として表現され、タグ値は無視されます。
-
不定長項目は、変換の前に確定長にされます。
4.2. JSON から CBOR への変換
すべての JSON 値は、いったんデコードされれば、1 つ以上の CBOR 値に直接対応付けられます。あらゆる種類の CBOR 生成と同様に、数値表現に関して決定を下す必要があります。提案される変換では:
-
小数部を持たない JSON の数値 (整数) は、最短の形式を選択して整数 (主タイプ 0 および 1、場合によっては主タイプ 6 のタグ値 2 および 3) として表現されます。実装定義のしきい値 (通常は 32 ビットまたは 64 ビット) より長い整数は、代わりに浮動小数点値として表現される場合があります。(JSON が JavaScript 実装から生成された場合、その精度はすでに最大 53 ビットに制限されています。)
-
小数部を持つ数値は、浮動小数点値として表現されます。望ましくは、最短の厳密な浮動小数点表現が使用されます。例えば、1.5 は 16 ビット浮動小数点値で表現されます (ただし、最小形式を効率的に見つけられる実装ばかりではありません)。表現される値の精度に影響する、実装定義の精度制限がある場合があります。10 進表現は、プロトコルで指定されている場合にのみ使用すべきです。
CBOR は一般に JSON よりコンパクトなエンコーディングを提供するように設計されています。思いつく可能性のある実装戦略の 1 つは、単一のバッファ内でインプレースに JSON から CBOR へのエンコーディングを行うことです。この戦略では、多くの病的なケースを注意深く考慮する必要があります。例えば、エスケープがほとんどまたは全くなく、255 バイトより長い (またはそれよりはるかに長い) 文字列は、CBOR の UTF-8 文字列としてエンコードすると拡大する可能性があります。同様に、一部のバイナリ浮動小数点表現は、JSON の一部の短い 10 進表現 (1.1、1e9) からの拡大を引き起こす可能性があります。これを正しく行うのは難しい場合があり、結果として生じる脆弱性が攻撃者に悪用される可能性があります。