8. 字串編碼資料內容的詞彙
8.1. 前言
本節中定義的註釋表示實例包含以 JSON 字串編碼的非 JSON 資料。¶
這些屬性提供了額外的資訊,用於將 JSON 資料解讀為豐富的多媒體文件。它們描述了內容的類型、編碼方式,以及/或者如何驗證。它們的功能並非驗證斷言;格式錯誤的字串編碼文件「不得」導致包含該文件的實例被視為無效。¶
沒有使用 "$vocabulary" 的元架構,應被視為要求此詞彙表,如同其 URI 存在且值為 true 一樣。¶
此詞彙表(稱為 Content 詞彙表)目前的 URI 為:<https://json-schema.dev.org.tw/draft/2020-12/vocab/content>。¶
對應的元架構目前的 URI 為:https://json-schema.dev.org.tw/draft/2020-12/meta/content。¶
8.2. 實作要求
由於安全性和效能考量,以及可能內容類型的開放性,實作「不得」預設自動解碼、解析和/或驗證字串內容。這也額外支援了嵌入式文件的使用案例,這些文件旨在由處理包含文件的不同消費者處理。¶
本節中的所有關鍵字僅適用於字串,對其他資料類型無效。¶
實作「可以」提供自動解碼、解析和/或驗證字串內容的功能。但是,「不得」預設執行這些操作,並且「必須」將每個字串編碼文件的驗證結果與封閉文件分開提供。此過程「應」等同於針對原始架構完整評估實例,然後使用註解來解碼、解析和/或驗證每個字串編碼文件。目前,執行和返回來自此自動解碼、解析和驗證功能的已解析資料和/或驗證結果的確切機制尚未指定。如果此類功能被證明受歡迎,則可能會在未來的草案中更詳細地指定。¶
8.3. contentEncoding
如果實例值是一個字串,則此屬性定義該字串「應」被解讀為編碼的二進位資料,並使用此屬性命名的編碼進行解碼。¶
RFC 4648 [RFC4648]中列出了指示 base 16、32 和 64 編碼的可能值及其多種變體。此外,RFC 2045 [RFC2045] 的 6.7 和 6.8 節提供了 MIME 中使用的編碼。此關鍵字源自 MIME 的 Content-Transfer-Encoding 標頭,該標頭旨在將二進位資料映射到 ASCII 字元。它與 HTTP 的 Content-Encoding 標頭無關,後者用於編碼(例如壓縮或加密)HTTP 請求和回應的內容。¶
由於 RFC 中都定義了 "base64",因此「應」採用 RFC 4648 中的定義,除非該字串明確旨在用於 MIME 環境。請注意,所有這些編碼都會產生僅由 7 位 ASCII 字元組成的字串。因此,此關鍵字對於包含該範圍之外字元的字串沒有意義。¶
如果缺少此關鍵字,但存在 "contentMediaType",則表示該編碼是身分編碼,這意味著為了在 UTF-8 字串中表示內容,不需要進行轉換。¶
此屬性的值「必須」為字串。¶
8.4. contentMediaType
如果實例是一個字串,則此屬性表示字串內容的媒體類型。如果存在 "contentEncoding",則此屬性描述已解碼的字串。¶
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 演算法進行 MACed 的 JWT,並且在其聲明集中需要 "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 字串如何解碼為兩個 JSON 資料結構的列表:首先是標頭,然後是 payload。由於 JWT 媒體類型確保 JWT 可以用 JSON 字串表示,因此無需進一步編碼或解碼。¶