在 JsonSchema 中,格式值应该设置为 "full-date" 还是 "date"?
In JsonSchema, the format value should be set as "full-date" or "date"?
您可以使用 jsonSchemaLint 进行测试。
我有这个 Json 架构,它将格式设置为 "full-date"。所有 Draft-6 验证器 (Json.Net) 都接受该架构是有效的。
{
"title": "MyTestSchema",
"type": "object",
"properties": {
"MyDateValue": {
"type": "string",
"format": "full-date",
"description": "We expect yyyy-MM-dd"
}
}
}
但是无法识别这个Json对象是错误的:
{
"MyDateValue": "2017-10-1"
}
当我将模式从 "full-date" 切换到 "date" 时,它起作用了:
{
"title": "MyTestSchema",
"type": "object",
"properties": {
"MyDateValue": {
"type": "string",
"format": "date",
"description": "We expect yyyy-MM-dd"
}
}
}
最上面的那个 ("full-date") 是否符合 Json 规则?请参考一些文档。
该值应该是 date
而不是 full-date
请参考
this documentation
以下是有效值
date-time :这应该是 YYYY-MM- 的 ISO 8601 格式的日期
DDThh:mm:ssZ UTC 时间。这是日期/的推荐形式
时间戳。
date :这应该是 YYYY-MM-DD 格式的日期。这是
建议您使用“日期时间”格式而不是“日期”
除非你只需要传输日期部分。
time :这应该是 hh:mm:ss 格式的时间。这是
建议您使用“日期时间”格式而不是“时间”
除非你只需要传输时间部分。
utc-millisec :这应该是差异,以
毫秒,在指定时间和午夜之间,00:00
世界标准时间 1970 年 1 月 1 日。该值应该是一个数字(整数或
浮动)。
来源:here
参考 github here 上的这个问题,事实证明创建自己的模式代码是可以的,因为验证器可能无法捕获它。
“它在技术上总是正确的,因为格式是可扩展的。但是,用户定义的格式将被不识别它们的验证器忽略。当然,如果其他人正在使用他们配置为识别的验证器相同的名称但不同地对待它,那么您将遇到互操作性问题。但是,对于这个特定的值,full-date,它取决于您的 JSON Schema 版本。
在 draft-04 或 draft-06 中,全日期不是官方格式。尽管任何将它添加为自定义格式但没有它的人意味着它在 RFC 3339 中的意思是自找麻烦,所以即使在那些版本中你也可以这样使用它。
在即将到来的(下周?希望如此?)draft-07 中,全日期是保留的 RFC 3339 格式名称空间的一部分,如果实施,必须与 RFC 3339 的全日期定义兼容。 draft-07 还将日期定义为完整日期的同义词,并建议改用它,因为据我所知,日期在野外更常见。
无论哪种方式,您在此处展示的这种用法可能非常安全,因为它符合 RFC 3339,并且从 draft-07 开始,该标准不强制支持,但确实强制执行,如果实施,它必须按预期运行通过 RFC 3339."
您可以使用 jsonSchemaLint 进行测试。
我有这个 Json 架构,它将格式设置为 "full-date"。所有 Draft-6 验证器 (Json.Net) 都接受该架构是有效的。
{
"title": "MyTestSchema",
"type": "object",
"properties": {
"MyDateValue": {
"type": "string",
"format": "full-date",
"description": "We expect yyyy-MM-dd"
}
}
}
但是无法识别这个Json对象是错误的:
{
"MyDateValue": "2017-10-1"
}
当我将模式从 "full-date" 切换到 "date" 时,它起作用了:
{
"title": "MyTestSchema",
"type": "object",
"properties": {
"MyDateValue": {
"type": "string",
"format": "date",
"description": "We expect yyyy-MM-dd"
}
}
}
最上面的那个 ("full-date") 是否符合 Json 规则?请参考一些文档。
该值应该是 date
而不是 full-date
请参考
this documentation
以下是有效值
date-time :这应该是 YYYY-MM- 的 ISO 8601 格式的日期 DDThh:mm:ssZ UTC 时间。这是日期/的推荐形式 时间戳。
date :这应该是 YYYY-MM-DD 格式的日期。这是 建议您使用“日期时间”格式而不是“日期” 除非你只需要传输日期部分。
time :这应该是 hh:mm:ss 格式的时间。这是 建议您使用“日期时间”格式而不是“时间” 除非你只需要传输时间部分。
utc-millisec :这应该是差异,以 毫秒,在指定时间和午夜之间,00:00 世界标准时间 1970 年 1 月 1 日。该值应该是一个数字(整数或 浮动)。
来源:here
参考 github here 上的这个问题,事实证明创建自己的模式代码是可以的,因为验证器可能无法捕获它。
“它在技术上总是正确的,因为格式是可扩展的。但是,用户定义的格式将被不识别它们的验证器忽略。当然,如果其他人正在使用他们配置为识别的验证器相同的名称但不同地对待它,那么您将遇到互操作性问题。但是,对于这个特定的值,full-date,它取决于您的 JSON Schema 版本。
在 draft-04 或 draft-06 中,全日期不是官方格式。尽管任何将它添加为自定义格式但没有它的人意味着它在 RFC 3339 中的意思是自找麻烦,所以即使在那些版本中你也可以这样使用它。
在即将到来的(下周?希望如此?)draft-07 中,全日期是保留的 RFC 3339 格式名称空间的一部分,如果实施,必须与 RFC 3339 的全日期定义兼容。 draft-07 还将日期定义为完整日期的同义词,并建议改用它,因为据我所知,日期在野外更常见。
无论哪种方式,您在此处展示的这种用法可能非常安全,因为它符合 RFC 3339,并且从 draft-07 开始,该标准不强制支持,但确实强制执行,如果实施,它必须按预期运行通过 RFC 3339."