在JsonSchema中,格式值应设置为"完整日期"还是"日期"?

Hak*_*gan 5 json rfc json.net jsonschema json-schema-validator

您可以使用jsonSchemaLint进行测试.

我有这个JsonSchema,它将格式设置为"完整日期".所有Draft-6验证器(Json.Net)都接受模式为有效.

{
  "title": "MyTestSchema",
  "type": "object",
  "properties": {
    "MyDateValue": {
      "type": "string",
      "format": "full-date",
      "description": "We expect yyyy-MM-dd"
    }
  }
}
Run Code Online (Sandbox Code Playgroud)

但它无法识别这个Json对象是错误的:

{
 "MyDateValue": "2017-10-1"
}
Run Code Online (Sandbox Code Playgroud)

当我将架构从"完整日期"切换到"日期"时,它可以工作:

 {
  "title": "MyTestSchema",
  "type": "object",
  "properties": {
    "MyDateValue": {
      "type": "string",
      "format": "date",
      "description": "We expect yyyy-MM-dd"
    }
  }
}
Run Code Online (Sandbox Code Playgroud)

是Json规则的最佳("完整日期")正确术语吗?请参考一些文档.

Gan*_*esh 10

值应该是date,full-date请参阅 此文档

以下是有效值

  1. 日期时间:这应该是ISO 8601格式的日期,YYYY-MM-DDThh:mm:ssZ,UTC时间.这是日期/时间戳的推荐形式.

  2. 日期:这应该是YYYY-MM-DD格式的日期.除非您只需要传输日期部分,否则建议您使用"日期 - 时间"格式而不是"日期".

  3. 时间:这应该是hh:mm:ss格式的时间.除非您只需要传输时间部分,否则建议您使用"日期时间"格式而不是"时间".

  4. utc-millisec:这应该是在UTC时间1970年1月1日00:00的指定时间和午夜之间以毫秒为单位的差异.值应该是一个数字(整数或浮点数).

来源:这里


Hak*_*gan 0

github 上参考这个问题,事实证明,在知道验证器可能无法捕获它的情况下,创建自己的模式代码是可以的。

“从技术上讲,它总是正确的,因为格式是可扩展的。但是,用户定义的格式将被无法识别它们的验证器忽略。当然,如果其他人正在使用他们已配置为识别相同名称但处理的验证器如果不同,那么你将会遇到互操作性问题。但是,对于这个特定值,完整日期,它取决于你的 JSON Schema 版本。

在 Draft-04 或 Draft-06 中,完整日期不是官方格式。尽管任何将其添加为自定义格式但没有它的含义与 RFC 3339 中的含义相同的人都是自找麻烦,因此即使在这些版本中,您也可能可以以这种方式使用它。

在即将到来的(下周?希望如此?)draft-07 中,完整日期是保留的 RFC 3339 格式名称空间的一部分,如果实现,必须与 RFC 3339 的完整日期定义兼容。Draft-07 还将日期定义为完整日期的同义词,并建议使用它,因为据我所知,日期在野外更常见。

无论哪种方式,您在此处显示的这种用法可能非常安全,因为它与 RFC 3339 匹配,并且从草案 07 开始,该标准不强制执行支持,但确实强制执行,如果实施,它必须按照 RFC 3339 的预期运行。”