json架构日期时间未正确检查

IHe*_*oid 31 datetime json jsonschema

我有一个JSON和一个JSON模式

JSON:

{
"aaa": "4000-02-01 00:00:00"
}
Run Code Online (Sandbox Code Playgroud)

JSON-模式:

{
    "$schema": "http://json-schema.org/draft-04/schema",
    "type": "object",
    "properties": {

        "aaa": {
            "type": "string",
            "format": "date-time"
        }


    }, "required": ["aaa"]
}
Run Code Online (Sandbox Code Playgroud)

JSON由JSON模式验证.但是,如果我将字段更改aaa为"bla",则架构不会再注意到它不再是日期时间.

我错过了架构中的任何内容吗?

Bea*_*ker 33

对于Python的jsonschema库,在调用时指定格式检查器validate:

jsonschema.validate(data, schema, format_checker=jsonschema.FormatChecker())
Run Code Online (Sandbox Code Playgroud)

要验证日期时间格式,应安装strict-rfc3339软件包.

请参阅验证格式.


clo*_*eet 9

验证"format"是可选的.这部分是因为允许模式作者完全组成新格式,因此期望验证所有格式是不合理的.

您的库应该(如果它是体面的)有办法为特定格式注册自定义验证器.例如,tv4验证库(在JavaScript中)具有以下tv4.addFormat()方法:

tv4.addFormat('date-time', function (data) {
    return isValidDate(data);
});
Run Code Online (Sandbox Code Playgroud)

完成此操作后"format": "date-time",在架构中应正确验证日期.

  • 在您链接的地方,它首先说"实施**可能**支持"格式"关键字.他们应该选择这样做......".所以它是支持"格式"的MAY--但如果你这样做,那么你应该支持标准集. (2认同)
  • 开箱即用,tv4根本不支持任何"格式"值.但是,该项目肯定在寻找一套标准的"格式"验证器,如果您愿意,可以提供帮助.:) (2认同)

Mat*_*int 5

您使用的JSON模式验证的实现很可能需要T日期和时间部分之间的分隔符。这是RFC3339规范和ISO8601的基础。尽管两者都有省略的规定T,但它们都使它可以通过协议来完成,而不是必须要支持的事情。(去搞清楚。)

另外,RFC3339 确实要求您包括时区偏移量或A Z以指示UTC。这将其锁定到特定的时间点,而不是在某个未知时区的人为表示。由于您都不需要,因此很有可能验证失败。

根据JSON Schema规范

7.3.1.2。验证方式

如果字符串实例是由RFC 3339第5.6节 [RFC3339] 定义的有效日期表示形式,则对此属性有效。


IHe*_*oid 2

我通过使用这个库找到了解决方法。它检查 javascript 代码中字段的内容:

function isValidDate(datestring) {

    var format = d3.time.format("%Y-%m-%d %H:%M:%S");
    var date = format.parse(datestring);  
    if (date) {
        return true;
    }
    return false;
}
Run Code Online (Sandbox Code Playgroud)