参考

字符串

string 类型用于文本字符串。它可能包含 Unicode 字符。

特定语言信息:
Python
Ruby
Objective-C
Swift
在 Python 中,“string”类似于 Python 上的 unicode 类型
schema
{ "type": "string" }
数据
"Déjà vu"
符合模式
数据
""
符合模式
数据
"42"
符合模式
数据
42
不符合模式

长度

可以使用 minLengthmaxLength 关键字 来限制字符串的长度。对于这两个关键字,值必须是非负数。

schema
{ "type": "string", "minLength": 2, "maxLength": 3}
数据
"A"
不符合模式
数据
"AB"
符合模式
数据
"ABC"
符合模式
数据
"ABCD"
不符合模式

正则表达式

关键字 pattern 用于将字符串限制为特定的正则表达式。正则表达式语法是 JavaScript (ECMA 262 特别是) 中定义的语法,并支持 Unicode。请参阅 正则表达式 了解详细信息。

在定义正则表达式时,重要的是要注意,如果表达式在字符串中的任何位置匹配,则该字符串被认为是有效的。例如,正则表达式 "p" 将匹配任何包含 p 的字符串,例如 "apple",而不仅仅是 "p"。因此,除非有充分的理由,否则通常将正则表达式包含在 ^...$ 中,例如 "^p$",这样通常会更清晰。

以下示例匹配一个简单的北美电话号码,包含可选的区号

schema
{ "type": "string", "pattern": "^(\\([0-9]{3}\\))?[0-9]{3}-[0-9]{4}$"}
数据
"555-1212"
符合模式
数据
"(888)555-1212"
符合模式
数据
"(888)555-1212 ext. 532"
不符合模式
数据
"(800)FLOWERS"
不符合模式

格式

关键字 format 允许对某些常用字符串值的类型进行基本的语义识别。例如,由于 JSON 没有 "DateTime" 类型,因此日期需要编码为字符串。 format 允许模式作者指示字符串值应被解释为日期。默认情况下,format 只是一个注释,不会影响验证。

可选地,验证器 实现 可以提供一个配置选项来启用 format 作为断言而不是注释。这意味着如果例如具有 date 格式的值不是可以解析为日期的形式,则验证将失败。这允许值被约束到超出 JSON 模式中的其他工具(包括 正则表达式)所能做到的范围。

实现可能仅针对内置格式的子集提供验证,或对给定格式进行部分验证。例如,一些实现可能认为包含 @ 的字符串是电子邮件,而其他实现可能会对格式良好的电子邮件地址的其他方面进行额外的检查。

JSON 模式规范中倾向于使用网络相关的格式,这很可能是由于其在 Web 技术中的起源。但是,只要交换 JSON 文档的各方也交换有关自定义格式类型的的信息,就可以使用自定义格式。JSON 模式验证器将忽略它不理解的任何格式类型。

内置格式

以下是 JSON 模式规范中指定的格式列表。

日期和时间

日期和时间以 RFC 3339,第 5.6 节 的形式表示。这是日期格式的子集,也通常称为 ISO8601 格式

  • "date-time":日期和时间组合在一起,例如,2018-11-13T20:20:39+00:00
  • "time":
    草案 7 中新增
    时间,例如,20:20:39+00:00
  • "date":
    草案 7 中新增
    日期,例如,2018-11-13
  • "duration":
    2019-09 草案中新增
    ISO 8601 ABNF for "duration" 定义的持续时间。例如,P3D 表示持续时间为 3 天。

电子邮件地址

  • "email":互联网电子邮件地址,请参阅 RFC 5321,第 4.1.2 节
  • "idn-email":
    草案 7 中新增
    互联网电子邮件地址的国际化形式,请参阅 RFC 6531

主机名

IP 地址

资源标识符

  • "uuid":
    2019-09 草案中新增
    通用唯一标识符 (UUID),根据 RFC 4122 定义。例如:3e4666bf-d5e5-4aa7-b8ce-cefe41c7568a
  • "uri": 通用资源标识符 (URI),根据 RFC3986
  • "uri-reference":
    草案 6 中的新增内容
    URI 引用(URI 或相对引用),根据 RFC3986,第 4.1 节
  • "iri":
    草案 7 中新增
    "uri" 的国际化等效项,根据 RFC3987
  • "iri-reference":
    草案 7 中新增
    "uri-reference" 的国际化等效项,根据 RFC3987

如果模式中的值可以相对于特定的源路径(例如,来自网页的链接),通常最好使用 "uri-reference"(或 "iri-reference")而不是 "uri"(或 "iri")。"uri" 应仅在路径必须为绝对路径时使用。

URI 模板

  • "uri-template":
    草案 6 中的新增内容
    根据 RFC6570 的 URI 模板(任何级别)。如果您还不知道什么是 URI 模板,您可能不需要此值。

JSON 指针

  • "json-pointer":
    草案 6 中的新增内容
    JSON 指针,根据 RFC6901。在 构建复杂模式 中,对 JSON 模式中使用 JSON 指针进行了更多讨论。请注意,这应仅在整个字符串仅包含 JSON 指针内容时使用,例如 /foo/bar。JSON 指针 URI 片段,例如 #/foo/bar/ 应使用 "uri-reference"
  • "relative-json-pointer":
    草案 7 中新增
    相对 JSON 指针

正则表达式

  • "regex":
    草案 7 中新增
    正则表达式,应根据 ECMA 262 方言 有效。

请注意,在实践中,JSON 模式验证器仅需要接受 正则表达式 的安全子集,该子集在本文件中其他地方有描述。

需要帮助?

您觉得这些文档有用吗?

帮助我们使我们的文档更出色!

在 JSON 模式中,我们非常重视文档贡献,就像其他任何类型的贡献一样!

仍然需要帮助?

学习 JSON 模式通常很令人困惑,但不要担心,我们在这里帮助您!。