2013-12-21 68 views
3

失敗在一個字典來驗證IP地址,文件API.json如下:JSON模式驗證IP地址是不工作

{ 
"$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 
} 

代碼如下:

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))) 

而版畫是這些:

'abc' is not one of [u'spice', u'vnc'] 

顯然, '777.485.999', '高清' 和 'FE00 :: 0abcdefdefs' 沒有IP地址,但該測試腳本不給他們警告。 我發現了一篇關於'ip-address'的文檔(http://tools.ietf.org/html/draft-zyp-json-schema-03),但不是'ipv4',但它也不起作用。

[編輯]: 我已經爲Draft3Validator添加了FormatChecker(),但它仍然不起作用。但是,當我嘗試,Draft4Validator是好的。在文檔中,我沒有發現Draft3Valdator不支持格式/ IP地址任何地方,它應該工作。

+3

呃你爲什麼不使用一個列表,而不是這個可怕的'當地人()'黑客和不同的變量? – ThiefMaster

+0

你正在使用哪個工具?格式的驗證是可選的,但大多數工具都允許您爲特定格式提供擴展/自定義驗證。 – cloudfeet

回答

3

明白了,這不是因爲Draft3Validator不支持「format/ip-address」,而是「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 
} 

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

2

退房的docs

格式驗證是可選的,你需要的格式檢查來啓用它。

+0

謝謝你,朱利安。你的答案是有幫助的。 – apporc