使用任意键进行JSON模式验证

19

我正在使用validictory验证附加的JSON数据和模式。目前工作正常。

然而,数据字典可以具有任意字符串键(除了“bp”之外的其他键)。这里模式中的“bp”键是硬编码的...它可以是给定列表(字符串枚举)中的字符串。如何在字典的“第一层”中添加enum定义。

import json
import validictory

data = {'bp': [{'category': 'bp',
         'created': '2013-03-08T09:14:48.148000',
         'day': '2013-03-11T00:00:00',
         'id': 'dc049c0e-d19a-4e3e-93ea-66438a239712',
         'unit': 'mmHg',
         'value': 147.0,
         'value2': 43.0}]}


schema = {
    "type":"object",
    "properties":{
        "bp": {
            "type":"array",
            "required":False,
            "items":
                {
                    "type":"object",
                    "required":False,
                    "properties":{
                        "category": {
                            "type":"string",
                            "default": "bp",
                            "required":False
                        },
                        "created": {
                            "type":"string",
                            "default": "2013-03-08T09:14:48.148000",
                            "required":False
                        },
                        "day": {
                            "type":"string",
                            "default": "2013-03-11T00:00:00",
                            "required":False
                        },
                        "id": {
                            "type":"string",
                            "default": "dc049c0e-d19a-4e3e-93ea-66438a239712",
                            "required":False
                        },
                        "unit": {
                            "type":"string",
                            "default": "mmHg",
                            "required":False
                        },
                        "value2": {
                            "type":"number",
                            "default":43,
                            "required":False
                        },
                        "value": {
                            "type":"number",
                            "default":147,
                            "required":False
                        }
                    }
                }


        }
    }
}

validictory.validate(data,schema)

你能展示一下如何重现这个问题吗?我目前还没有看到任何问题。 - jsalonen
1
@jsalonen:问题在于,如果顶层关键字与bp不同,OP希望验证输入。我认为问题描述已经足够清晰,有JSON-schema经验的人应该能够提供帮助。 - Martijn Pieters
这似乎是你之前问题的延续。如果你在学习JSON Schema时遇到了更一般性的问题,可以访问JSON Schema Google Group。此外,检查一下freenode上的#json-schema,看看是否有人在线也是值得的。 - cloudfeet
1个回答

33

这取决于您要做什么。

如果您希望获得一系列属性的相同规范,则可以将定义抽象出来:

{
    "type": "object",
    "properties": {
        "bp": {"$ref": "#/definitions/categoryList"},
        "foo": {"$ref": "#/definitions/categoryList"},
        "bar": {"$ref": "#/definitions/categoryList"}
    },
    "definitions": {
        "categoryList": {...}
    }
}

如果你想让任何属性遵循该模式,你可以使用additionalProperties

{
    "type": "object",
    "additionalProperties": {...}
}

或一系列属性(通过模式匹配) - 例如,任何小写字母:

{
    "type": "object",
    "patternProperties": {
        "^[a-z]+$": {...}
    }
}

如果您想限制可以定义的属性数量,则可以使用“maxProperties”(仅适用于标准的v4版本):

{
    "type": "object",
    "additionalProperties": {...},
    "maxProperties": 1
}

P.S. - 在标准的v4版本中,“required”是一个数组。事实上,即使在v3中,“required”默认值也为false,所以您的示例根本不需要它。


4
patternProperties完成任务。 - user2665694
我应该说,如果有一个固定的可能键集合(例如10个左右),那么第一种选项可能最为描述性。然而,如果有任何无限或极大范围,则patternProperties绝对是最佳选择。 - cloudfeet

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