字符串(string)
该string
类型用于文本字符串。它可能包含 Unicode 字符。
在 Python 中,“string”类似于 Python 2.x 上的
unicode
和 Python 3.x 上的 str 类型。在 Ruby 中,“string”类似于
String
类型
{ "type": "string" }
"This is a string" // OK
"Déjà vu" // OK,Unicode 字符
"" // OK
"42" // OK
42 // not OK
长度
可以使用minLength
和 maxLength
关键字来限制字符串的长度。对于这两个关键字,该值必须是非负数。
{
"type": "string",
"minLength": 2,
"maxLength": 3
}
"A" // not ok
"AB" // ok
"ABC" // ok
"ABCD" // not ok
正则表达式
pattern
关键字用于将字符串限制为特定的正则表达式。正则表达式语法是在 JavaScript(特别是ECMA 262 )中定义的。有关更多信息,请参阅正则表达式。
笔记 在定义正则表达式时,重要的是要注意,如果表达式匹配字符串中的任何位置,则该字符串被认为是有效的。例如,正则表达式"p"将匹配任何包含一个
p
的字符串,例如"apple"不仅仅是一个简单的字符串"p"。因此,将正则表达式括在^...$
中(例如,"^p$"),通常不会令人困惑,除非有充分的理由不这样做。
以下示例匹配一个带有可选区号的简单北美电话号码:
{
"type": "string",
"pattern": "^(\\([0-9]{3}\\))?[0-9]{3}-[0-9]{4}$"
}
"555-1212" // OK
"(888)555-1212" // OK
"(888)555-1212 ext. 532" // not OK
"(800)FLOWERS" // not OK
格式
该format
关键字允许对常用的某些类型的字符串值进行基本语义识别。例如,因为 JSON 没有“DateTime”类型,所以需要将日期编码为字符串。format
允许模式作者指示字符串值应解释为日期。默认情况下,format
只是一个注释,不影响验证。
可选地,验证器实现可以提供一个配置选项来启用format
作为断言而不仅仅是注释的功能。这意味着,如果具有 date 格式的值不是可以解析为日期的形式,则验证将失败。这可以允许值的约束超出 JSON Schema 中的其他工具,包括正则表达式
可以执行的操作。
笔记 实例可能只为内置格式的一个子集提供验证,或者对给定格式进行部分验证。例如,一些实例可能会将包含@的字符串视为电子邮件,而其他实例可能会根据格式良好的电子邮件地址的对字符串进行额外检查。
JSON Schema 规范中偏向于与网络相关的格式,这很可能是由于其在 Web 技术方面的传统。但是,也可以使用自定义格式,只要交换 JSON 文档的各方也交换有关自定义格式类型的信息即可。JSON Schema 验证器将忽略它不理解的任何格式类型。
内置格式
以下是 JSON Schema 规范中指定的格式列表。
日期和时间
日期和时间在RFC 3339 第 5.6 节中表示。这是日期格式的子集,也通常称为ISO8601 格式。
"date-time"
:日期和时间在一起,例如,2018-11-13T20:20:39+00:00
。"time"
:draft7 的时间,例如,20:20:39+00:00
"date"
:draft7 的日期,例如,2018-11-13
。
电子邮件地址
"email"
:Internet 电子邮件地址,请参阅RFC 5322,第 3.4.1 节。"idn-email"
:draft7 的新内容 Internet 电子邮件地址的国际化形式,请参阅 RFC 6531。
主机名
"hostname"
: Internet 主机名,请参阅RFC 1034,第 3.1 节。"idn-hostname"
:draft7 的 中的新内容,国际化 Internet 主机名,请参阅 RFC5890,第 2.3.2.3 节。
IP 地址
"ipv4"
:IPv4 地址,根据RFC 2673 第 3.2 节中定义的点分四线 ABNF 语法。"ipv6"
:IPv6 地址,如RFC 2373 第 2.2 节中所定义。
资源标识符
"uri"
:根据RFC3986 的通用资源标识符 (URI) 。"uri-reference"
:draft7 6 中的新增内容,一个 URI 引用(URI 或相对引用),根据RFC3986 第 4.1 节。"iri"
:draft 7 中的新内容,根据RFC3987,“uri”的国际化等价物。"iri-reference"
:draft7 中的新内容,根据RFC3987,“uri-reference”的国际化等价物
如果模式中的值能够与特定的源路径(例如来自网页的链接)相关联,那么使用"uri-reference"
(or "iri-reference"
) 而不是"uri"
(or "iri"
)通常是更好的做法 。"uri"
只应在路径必须是绝对路径时使用。
- draft 4 只包括
"uri"
,不包括"uri-reference"
。因此,是否"uri"
应该接受相对路径存在一些歧义。
URI 模板
"uri-template"
:draft 6 中的新增内容,一个 URI 模板(任何级别)根据 RFC6570。如果您还不知道 URI 模板是什么,您可能不需要这个值。
JSON 指针
"json-pointer"
:draft6 中的新内容,一个 JSON 指针,根据RFC6901。在构建复杂模式中有更多关于在 JSON Schema 中使用 JSON Pointer 的讨论。请注意,仅当整个字符串仅包含 JSON 指针内容时才应使用此方法,例如/foo/bar
. JSON 指针 URI 片段,例如#/foo/bar/
应该使用"uri-reference"
."relative-json-pointer"
:draft7 中的新内容,一个相对 JSON 指针。
正则表达式
"regex"
:draft7 中的新内容,正则表达式,根据ECMA 262 应有效。
请注意,在实践中,JSON 模式验证器只需要接受本文档其他地方描述的正则表达式的安全子集。