【问题标题】:Generating validation code from JSON schema从 JSON 模式生成验证代码
【发布时间】:2018-08-31 11:51:45
【问题描述】:

是否有现有的 python 包可以帮助我从 json 模式生成代码?

例如,如果我有一个像

这样的 JSON 对象
{       
    "attribute": "obj.value",      
    "operator":  "greater than",      
    "value" : 235 
}

我希望能够获取此 JSON 并将其作为规则应用于不同的对象,以查看哪些对象通过了规则。

所以理想情况下我想拥有类似的东西

is_valid(obj,schema)

在哪里

is_valid({"value":300},{"attribute":"value","operator":"greater than","value":235}) 

返回真

【问题讨论】:

标签: python python-3.x jsonschema


【解决方案1】:

jsonschema project 正是这样做的,根据有效的 JSON 模式验证 Python 数据结构:

from jsonschema import validate

validate(obj, schema)

当模式有效时返回None,当模式无效时引发异常。如果您必须有一个布尔值,请使用:

import jsonschema

def is_valid(obj, schema):
    try:
        jsonschema.validate(obj, schema)
    except jsonschema.ValidationError:
        return False
    else:
        return True

您确实需要使用有效的 JSON 架构约束。对于整数值,limit the range,如果您的值需要遵守边界,例如。

字典 {"value": 300} 是一个带有单个键的 JSON 对象,其中该单个键是具有下界的整数,因此将其定义为 JSON 模式:

schema = {
    "type": "object",
    "properties": {
        "value": {
            "type": "integer",
            "minimum": 235,
            "exclusiveMinimum": True
        }
    }
}

此架构验证您的示例值:

>>> import jsonschema
>>> def is_valid(obj, schema):
...     try:
...         jsonschema.validate(obj, schema)
...     except jsonschema.ValidationError:
...         return False
...     else:
...         return True
...
>>> schema = {
...     "type": "object",
...     "properties": {
...         "value": {
...             "type": "integer",
...             "minimum": 235,
...             "exclusiveMinimum": True
...         }
...     }
... }
>>> is_valid({'value': 300}, schema)
True
>>> is_valid({'value': 1}, schema)
False

阅读Understanding JSON Schema,了解如何编写此类模式的精彩教程。

【讨论】:

  • 据我了解,jsonschema 仅查看类型,而我正在查看更复杂的内容,例如 {"attribute":"value","operator":"not in","value":[ 'a','b','c']}如果我错了请纠正我
  • @Akshay:如果您的架构是有效的 JSON 架构,则 jsonschema.validate() 有效。该文档包括使用"items" : {"enum" : [1, 2, 3]}, 限制值等示例。
  • @Akshay:我为您的示例对象添加了示例架构。
  • @Akshay:对于排除子集(不在给定列表中)的具体示例,您可以使用 "not": {"enum": ["a", "b", "c"]},因此 JSON 模式几乎肯定已经涵盖了您的用例。
猜你喜欢
  • 2018-11-04
  • 2015-10-05
  • 2011-07-30
  • 1970-01-01
  • 1970-01-01
  • 2017-02-22
  • 1970-01-01
  • 2019-06-23
  • 2018-06-30
相关资源
最近更新 更多