8. 用于字符串编码数据内容的词汇表
8.1. 前言
本节中定义的注释表示实例包含以 JSON 字符串编码的非 JSON 数据。 ¶
这些属性提供了解释 JSON 数据作为丰富多媒体文档所需的其他信息。 它们描述了内容类型、编码方式和/或验证方式。 它们不作为验证断言;格式错误的字符串编码文档 MUST NOT 导致包含的实例被视为无效。 ¶
不使用“$vocabulary”的元模式 SHOULD 被视为需要此词汇表,就好像它的 URI 存在且值为 true 一样。 ¶
此词汇表的当前 URI(称为内容词汇表)为:<https://json-schema.fullstack.org.cn/draft/2020-12/vocab/content>。 ¶
相应元模式的当前 URI 为:https://json-schema.fullstack.org.cn/draft/2020-12/meta/content。 ¶
8.2. 实现要求
由于安全和性能问题,以及可能的內容类型的开放性,实现 MUST NOT 默认自动解码、解析和/或验证字符串内容。 这还支持将嵌入式文档用于与处理包含文档的消费者不同的消费者进行处理的用例。 ¶
本节中的所有关键字仅适用于字符串,对其他数据类型没有影响。 ¶
实现 MAY 提供自动解码、解析和/或验证字符串内容的能力。 但是,它 MUST NOT 默认执行这些操作,并且 MUST 分别提供每个字符串编码文档的验证结果,而不是包含文档。 此过程 SHOULD 等同于完全评估实例与原始模式,然后使用注释对每个字符串编码文档进行解码、解析和/或验证。 现在,这种自动解码、解析和验证功能执行和返回解析数据和/或验证结果的确切机制尚未指定。 如果这种功能很受欢迎,它可能会在未来的草案中更全面地指定。 ¶
8.3. contentEncoding
如果实例值为字符串,则此属性定义该字符串应被解释为编码的二进制数据,并使用此属性命名的编码进行解码。¶
RFC 4648 [RFC4648] 列出了表示具有多种变体的 16、32 和 64 进制编码的可能值。此外,RFC 2045 [RFC2045] 的第 6.7 节和第 6.8 节提供了 MIME 中使用的编码。此关键字源自 MIME 的 Content-Transfer-Encoding 标头,该标头旨在将二进制数据映射到 ASCII 字符。它与 HTTP 的 Content-Encoding 标头无关,后者用于对 HTTP 请求和响应的内容进行编码(例如压缩或加密)。¶
由于“base64”在两个 RFC 中都有定义,因此除非字符串专门用于 MIME 上下文,否则应假设来自 RFC 4648 的定义。请注意,所有这些编码都生成仅包含 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 字符串表示,因此不需要进一步编码或解码。¶