8. 文字列エンコードされたデータの内容のための語彙
8.1. 前書き
このセクションで定義される注釈は、インスタンスが JSON 文字列にエンコードされた非 JSON データを含むことを示します。¶
これらのプロパティは、JSON データをリッチなマルチメディア文書として 解釈するために必要な追加情報を提供します。これらは、内容の種類、 それがどのようにエンコードされているか、かつ/またはどのように検証できるかを 記述します。これらは検証表明としては機能しません。 不正な形式の文字列エンコード文書によって、それを含むインスタンスが 無効とみなされてはなりません。¶
"$vocabulary" を使用しないメタスキーマは、その URI が true の値で 存在するかのように、この語彙を要求するものとして扱うべきです。¶
Content 語彙として知られる、この語彙の現在の URI は次のとおりです: <https://json-schema.org/draft/2020-12/vocab/content>。¶
対応するメタスキーマの現在の URI は次のとおりです: https://json-schema.org/draft/2020-12/meta/content。¶
8.2. 実装 要件
セキュリティおよび性能上の懸念、ならびに可能な内容型が オープンエンドであることから、実装は、デフォルトで文字列の内容を 自動的にデコード、解析、かつ/または検証してはなりません。これはさらに、 埋め込まれた文書が、それを含む文書を処理したものとは異なる コンシューマによって処理されることを意図したユースケースもサポートします。¶
このセクションのすべてのキーワードは文字列にのみ適用され、他の データ型には効果を持ちません。¶
実装は、文字列の内容を自動的にデコード、解析、かつ/または検証する 機能を提供してもかまいません。ただし、これらの操作をデフォルトで 実行してはならず、各文字列エンコード文書の検証結果を、 それを囲む文書とは別に提供しなければなりません。この処理は、 元のスキーマに対してインスタンスを完全に評価し、その後、注釈を使用して 各文字列エンコード文書をデコード、解析、かつ/または検証することと 同等であるべきです。 現時点では、そのような自動デコード、解析、検証機能から 解析済みデータかつ/または検証結果を実行して返す正確な仕組みは 未規定のままです。そのような機能が普及した場合、将来のドラフトで より詳細に規定される可能性があります。 ¶
これらのキーワードに従ってインスタンス文字列を自動処理することで 導入される可能性のある脆弱性については、 セキュリティに関する考慮事項(Section 10) のセクションも参照してください。¶
8.3. contentEncoding
インスタンス値が文字列である場合、このプロパティは、その文字列が エンコードされたバイナリデータとして解釈され、このプロパティで指定された エンコーディングを使用してデコードされるべきであることを定義します。¶
base 16、32、および 64 のエンコーディングを示す可能な値と いくつかのバリエーションは、RFC 4648 [RFC4648] に列挙されています。さらに、 RFC 2045 [RFC2045] の 6.7 節および 6.8 節は、 MIME で使用されるエンコーディングを提供します。このキーワードは、 バイナリデータを ASCII 文字にマップするために設計された MIME の Content-Transfer-Encoding ヘッダーに由来します。これは、 HTTP リクエストおよびレスポンスの内容をエンコードする (例: 圧縮または暗号化する)ために使用される HTTP の Content-Encoding ヘッダーとは関係ありません。¶
"base64" は両方の RFC で定義されているため、その文字列が MIME コンテキストでの使用を明確に意図している場合を除き、 RFC 4648 の定義が想定されるべきです。これらのエンコーディングはすべて、 7ビット ASCII 文字のみからなる文字列になることに注意してください。 したがって、このキーワードは、その範囲外の文字を含む文字列には 意味を持ちません。¶
このキーワードが存在しないが "contentMediaType" が存在する場合、これは エンコーディングが identity エンコーディングであること、つまり UTF-8 文字列で内容を表すために変換が不要であったことを示します。¶
このプロパティの値は文字列でなければなりません。¶
8.4. contentMediaType
インスタンスが文字列である場合、このプロパティはその文字列の内容の メディアタイプを示します。"contentEncoding" が存在する場合、 このプロパティはデコードされた文字列を記述します。¶
このプロパティの値は文字列でなければならず、かつ RFC 2046 [RFC2046] で定義されるメディアタイプで なければなりません。¶
8.5. contentSchema
インスタンスが文字列であり、かつ "contentMediaType" が存在する場合、この プロパティはその文字列の構造を記述するスキーマを含みます。¶
このキーワードは、JSON Schema のデータモデルにマップできる任意の メディアタイプとともに使用してもかまいません。¶
このプロパティの値は有効な JSON スキーマでなければなりません。 "contentMediaType" が存在しない場合は無視されるべきです。¶
8.6. 例
これは、"contentEncoding" と "contentMediaType" の使用を示すスキーマ例です:¶
{
"type": "string",
"contentEncoding": "base64",
"contentMediaType": "image/png"
}
¶
このスキーマによって記述されるインスタンスは文字列であることが期待され、 その値は base64 エンコードされた PNG 画像として解釈できるべきです。¶
別の例です:¶
{
"type": "string",
"contentMediaType": "text/html"
}
¶
このスキーマによって記述されるインスタンスは、HTML を含む文字列であることが 期待され、JSON 文字列がデコードされた文字セットを使用します。 RFC 8259 [RFC8259] の 8.1 節に従い、完全に閉じた システムの外では、これは UTF-8 でなければなりません。¶
この例は、HMAC SHA-256 アルゴリズムを使用して MAC された JWT を記述し、 その claim set 内の "iss" および "exp" フィールドを要求します。¶
{
"type": "string",
"contentMediaType": "application/jwt",
"contentSchema": {
"type": "array",
"minItems": 2,
"prefixItems": [
{
"const": {
"typ": "JWT",
"alg": "HS256"
}
},
{
"type": "object",
"required": ["iss", "exp"],
"properties": {
"iss": {"type": "string"},
"exp": {"type": "integer"}
}
}
]
}
}
¶
"contentEncoding" が現れないことに注意してください。"application/jwt" メディアタイプは base64url エンコーディングを使用しますが、それは メディアタイプによって定義され、そのメディアタイプが JWT 文字列を 2つの JSON データ構造のリスト、すなわち最初にヘッダー、次にペイロードへと どのようにデコードするかを決定します。JWT メディアタイプは JWT が JSON 文字列で表現できることを保証するため、それ以上のエンコードまたは デコードは不要です。¶