8. 字串編碼資料內容的詞彙
8.1. 前言
本節中定義的註解表示實例包含以 JSON 字串編碼的非 JSON 資料。¶
這些屬性提供將 JSON 資料解譯為豐富多媒體文件所需的其他資訊。它們描述內容類型、其編碼方式和/或如何驗證。它們不作為驗證斷言;格式不正確的字串編碼文件不得導致包含實例被視為無效。¶
不使用「$vocabulary」的中繼綱要應被視為要求此詞彙,就像它的 URI 以 true 值存在一樣。¶
此詞彙 (稱為內容詞彙) 的目前 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 演算法進行 MAC 簽章的 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 資料結構的清單:首先是標頭,然後是有效負載。由於 JWT 媒體類型確保 JWT 可以用 JSON 字串表示,因此無需進一步編碼或解碼。¶