JSON Schema 验证 ip-address 不起作用

app*_*orc 5 python ip-address jsonschema

一键验证ip地址失败,文件API.json如下:

{
"$schema": "http://json-schema.org/draft-03/schema#",
"title": "test",
"type": "object",
"properties": {
    "type": {"enum": ["spice", "vnc"]},
    "listen": {
        "type": "string",
        "oneOf": [
            {"format": "ipv4"},
            {"format": "ipv6"}
        ]
    }
},
"additionalProperties": false
}
Run Code Online (Sandbox Code Playgroud)

代码如下:

from jsonschema import Draft3Validator, ValidationError, FormatChecker
import json

if __name__ == '__main__':
    graphics1 = {'type': 'spice', 'listen': '0.0.0.0'}
    graphics2 = {'type': 'vnc', 'listen': '0.0.0.0'}
    graphics3 = {'type': 'abc', 'listen': '0.0.0.0'}
    graphics4 = {'type': 'vnc', 'listen': '777.485.999'}
    graphics5 = {'type': 'vnc', 'listen': 'fe00::0'}
    graphics6 = {'type': 'vnc', 'listen': 'def'}
    graphics7 = {'type': 'vnc', 'listen': 'fe00::0abcdefdefs'}
    s = json.load(open('API.json'))
    validator = Draft3Validator(s, format_checker=FormatChecker())
    for x in range(1, 8):
        try:
            graphics = locals().get('graphics'+str(x))
            validator.validate(graphics)
        except ValidationError:
            print('; '.join(e.message for e in validator.iter_errors(graphics)))
Run Code Online (Sandbox Code Playgroud)

印刷品是这些:

'abc' is not one of [u'spice', u'vnc']
Run Code Online (Sandbox Code Playgroud)

显然, '777.485.999' 、'def' 和 'fe00::0abcdefdefs' 不是 IP 地址,但测试脚本不会给出有关它们的警告。我找到了一个文档(http://tools.ietf.org/html/draft-zyp-json-schema-03),它说的是“ip-address”,而不是“ipv4”,但它也不起作用。

[编辑]:我为 Draft3Validator 添加了 FormatChecker(),但它仍然无法正常工作。但正如我尝试的那样,Draft4Validator 没问题。在文档中,我没有发现 Draft3Valdator 在任何地方都不支持格式/IP 地址,它应该可以工作。

app*_*orc 6

明白了,不是因为 Draft3Validator 不支持“格式/IP 地址”,而是“oneOf”、“allOf”、“anyOf”和“not”。所以 API.json 应该是:

{
"$schema": "http://json-schema.org/draft-03/schema#",
"title": "test",
"type": "object",
"properties": {
    "type": {"enum": ["spice", "vnc"]},
    "listen": {
        "type": "string",
        "format": "ip-address"
    }
},   
"additionalProperties": false
}
Run Code Online (Sandbox Code Playgroud)

请参阅http://json-schema.org/draft-03/schema#http://json-schema.org/draft-04/schema#