【问题标题】:JSON schema validation with arbitrary keys使用任意键的 JSON 模式验证
【发布时间】:2014-06-11 19:55:27
【问题描述】:

我正在使用 validictory 来验证附加的 JSON 数据和架构。 工作至今。

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

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:问题是如果顶级密钥与bp 不同,OP 想要验证输入。我觉得问题描述已经够清楚了,有 JSON-schema 经验的人应该可以帮忙。
  • 这似乎是您上一个问题的后续。如果您在学习 JSON Schema 时遇到更普遍的问题,您可以通过 JSON Schema Google Group 放弃。如果有人在那里,还值得检查freenode 上的#json-schema。

标签: python validation jsonschema


【解决方案1】:

这完全取决于你想要做什么。

如果您想要相同的规范,但对于一系列属性,您可以抽象出定义:

{
    "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
}

附注- 在标准的 v4 中,“必需”是一个数组。事实上,即使在 v3 中,“必需”默认为 false,所以您的示例根本不需要它

【讨论】:

  • patternProperties 完成了这项工作
  • 我应该说,如果它是一组固定的可能键(例如 10 个左右),那么第一个选项可能是最具描述性的。但是,如果它们的范围无限大(或非常大),那么patternProperties 绝对是要走的路。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-12-14
  • 2022-01-02
  • 1970-01-01
  • 1970-01-01
  • 2015-07-18
相关资源
最近更新 更多