2013-10-11 26 views
3

我正在使用python-jsonschema進行json驗證。我有一個本地化的文本對象,其中RFC1766語言代碼鍵內指定爲如下:Jsonschema,使用自定義函數驗證對象鍵

"Description": { 
    "en": "English Description", 
    "sv": "Swedish Description", 
    "fr": "French Description" 
}, 

I've read in the documentation,我可以使用「格式」屬性使用函數來檢查自定義格式。所以,我寫了一個方法,它將一個字符串作爲參數,如果它是RFC1766語言字符串,則返回True。

@_checks_drafts('rfc1766lang') 
def rfc1766lang(instance): 
    """some logic, return True if rfc1766""" 

但是我找不到任何關於如何將此應用於對象鍵而不是值的驗證的示例。

這可能嗎?

我試圖像下面,但我不能成功

rfc1766_string_schema_v2 = { 
    'type': 'object', 
    'format': 'rfc1766lang',  
    'additionalProperties': False 
} 

我知道,如果我有JSON字符串如下它會容易得多。但是,現在這不是一個選項。

"Description": [{ 
    "lan": "en", 
    "text": "Description in English" 
}, { 
    "lan": "sv", 
    "name": "Description in Swedish" 
}] 
+0

我什至不能找到如何將您的自定義格式檢查器應用於一個值,這將幫助我很多。您僅提供的文檔鏈接顯示如何使用預定義的格式。 – kev

回答

5

這是一個非常好的相關的問題,因爲這實際上是proposed syntax for v5的一部分,所以官方元模式將不得不面對這一點。

JSON Schema無法爲對象鍵指定「格式」。對象鍵唯一的「驗證」JSON Schema支持是patternProperties,它提供了一個正則表達式。

對於語言代碼,你能做的最好的大概是這樣的:

{ 
    "type": "object", 
    "patternProperties": { 
     "^[a-zA-Z]+(-[a-zA-Z]+)*$": {...} 
    }, 
    "additionalProperties": false 
} 

,這樣,就只允許特性匹配的模式將限制該數據 - 但事實並非完全驗證你尋找,恐怕。