2013-11-21 40 views
5

我想用ruby gem json-schema驗證一些json數據。在JSON模式下的JSON數據驗證

我有以下模式:

{ 
"$schema": "http://json-schema.org/draft-04/schema#", 
"title": "User", 
"description": "A User", 
"type": "object", 
"properties": { 
     "name": { 
      "description": "The user name", 
      "type": "string" 
     }, 
     "e-mail": { 
      "description": "The user e-mail", 
      "type": "string" 
     } 
}, 
"required": ["name", "e-mail"]  
} 

及以下JSON數據:

{ 
"name": "John Doe", 
"e-mail": "[email protected]", 
"username": "johndoe" 
} 

和JSON :: Validator.validate,用這個數據作爲輸入,返回true。

不應該是錯誤的,因爲架構上沒有指定用戶名?

回答

6

你需要在你的JSON模式來定義additionalProperties並將其設置爲false

{ 
    "$schema": "http://json-schema.org/draft-04/schema#", 
    "title": "User", 
    "description": "A User", 
    "type": "object", 
    "properties": { 
    "name": { 
     "description": "The user name", 
     "type": "string" 
    }, 
    "e-mail": { 
     "description": "The user e-mail", 
     "type": "string" 
    } 
    }, 
    "required": ["name", "e-mail"], 
    "additionalProperties": false 
} 

現在驗證應該返回false預期:

require 'json' 
require 'json-schema' 

schema = JSON.load('...') 
data = JSON.load('...') 
JSON::Validator.validate(schema, data) 
# => false 
+0

請注意,這限制了您的擴展能力格式,因爲所有額外的屬性都被禁止。 – cloudfeet

+1

@cloudfeet在這種情況下,你也擴展了模式。 –

+1

我的意思是擴展而不修改原始類 - 例如某些第三方擴展了你的格式,或者你擴展了你公司中一個脾氣暴躁,頑強的人寫的格式。 – cloudfeet