Jsonschema,使用自定义函数验证对象键

时间:2013-10-11 20:00:16

标签: python jsonschema

我正在使用python-jsonschema进行json验证。我有一个对象,其本地化文本在rfc1766语言代码键中指定如下:

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

I've read in the documentation我可以使用'format'属性来检查使用函数的自定义格式。所以,我写了一个方法,它接受一个字符串作为参数,如果它是一个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"
}]

1 个答案:

答案 0 :(得分:5)

这是一个非常好的相关问题,因为它实际上是proposed syntax for v5的一部分,所以官方的元架构也必须处理这个问题。

JSON Schema无法为对象键指定“格式”。对象键唯一支持的“验证”JSON Schema是patternProperties,它提供正则表达式。

对于语言代码,您可以做的最好的事情可能是:

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

这会限制数据,因此只允许匹配该模式的属性 - 但这不是您正在寻找的完整验证,我担心。