【问题标题】:In JsonSchema, the format value should be set as "full-date" or "date"?在JsonSchema中,格式值应该设置为“full-date”还是“date”?
【发布时间】:2018-04-23 17:51:04
【问题描述】:

您可以使用jsonSchemaLint 进行测试。

我有这个 JsonSchema,它将格式设置为“完整日期”。所有 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"
}

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

 {
  "title": "MyTestSchema",
  "type": "object",
  "properties": {
    "MyDateValue": {
      "type": "string",
      "format": "date",
      "description": "We expect yyyy-MM-dd"
    }
  }
}

顶部的那个(“完整日期”)是 Json 规则的正确术语吗?请参考一些文档。

【问题讨论】:

    标签: json json.net jsonschema rfc json-schema-validator


    【解决方案1】:

    值应该是date 而不是full-date 请参考 this documentation

    以下是有效值

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

    2. 日期:这应该是格式为 YYYY-MM-DD 的日期。它是 建议您使用“日期-时间”格式而不是“日期” 除非您只需要传输日期部分。

    3. 时间:这应该是格式为 hh:mm:ss 的时间。它是 建议您使用“日期-时间”格式而不是“时间” 除非您只需要传输时间部分。

    4. utc-millisec :这应该是差异,以 毫秒,在指定时间和午夜 00:00 之间 世界标准时间 1970 年 1 月 1 日。该值应该是一个数字(整数或 浮动)。

    来源:here

    【讨论】:

    【解决方案2】:

    参考 github here 上的这个问题,结果证明可以创建自己的架构代码,但知道验证器可能无法捕获它。

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

    在draft-04 或draft-06 中,全日期不是官方格式。尽管任何将其添加为自定义格式但不具有它在 RFC 3339 中的含义的人都是在自找麻烦,因此即使在那些版本中,您也可以这样使用它。

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

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

    【讨论】:

      猜你喜欢
      • 2013-05-22
      • 2018-12-01
      • 2016-07-26
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-10-08
      • 1970-01-01
      • 2013-05-29
      相关资源
      最近更新 更多