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

3

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

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

我在文档中看到,我可以使用'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"
}]

我甚至找不到如何将您的自定义格式检查器应用于一个值,这对我非常有帮助。您提供的文档链接只展示了如何使用预定义的格式。 - kev
1个回答

6
这是一个非常好的和相关的问题,因为这实际上是 v5建议语法的一部分,因此官方元模式也必须处理这个问题。
JSON Schema无法为对象键指定“格式”。 JSON Schema支持的仅有的关于对象键的“验证”是patternProperties,它提供了正则表达式。
对于语言代码,你可以做的最好的事情可能是:
{
    "type": "object",
    "patternProperties": {
        "^[a-zA-Z]+(-[a-zA-Z]+)*$": {...}
    },
    "additionalProperties": false
}

这将限制数据,使其仅允许与该模式匹配的属性 - 但恐怕这并不是您要寻找的完整验证。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接