如何从架构中的 json 文件中获取缺少的字段,反之亦然
How can I get missing fields from json file in schema and vice versa
我已经使用 pip install jsonschema
安装了 jsonschema
。
from jsonschema import validate
schema_data = {
"type" : "object",
"properties" : {
"price" : {"type" : "number"},
"name" : {"type" : "string"},
"additional" : {"type" : "number"},
},
}
json_data = {"name" : "Eggs", "price" : 34.99, "new": 90}
我上面的 schema_data
和 json_data
只是验证数据类型。
这里additional
是schema_data
中的额外字段,json_data
中没有,new
存在于json_data
中,json_data
中没有schema_data
.
如何列出缺失的字段,例如 additional
在 json_data
中缺失,new
在 schema_data
?
在 JSON 架构中,默认情况下属性不是 必需的,您的架构所做的只是声明它们必须是什么类型 如果属性 存在 。因此,为了验证标记缺少 additional
,您需要先将该键标记为 a required property,方法是添加一个 required
列表,名称为:
schema_data = {
"type" : "object",
"properties" : {
"price" : {"type" : "number"},
"name" : {"type" : "string"},
"additional" : {"type" : "number"},
},
"required": ["price", "name", "additional"]
}
现在验证将无法通过您的 JSON 数据,因为缺少 additional
:
>>> validate(json_data, schema_data)
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
File "/.../site-packages/jsonschema/validators.py", line 541, in validate
cls(schema, *args, **kwargs).validate(instance)
File "/.../site-packages/jsonschema/validators.py", line 130, in validate
raise error
jsonschema.exceptions.ValidationError: 'additional' is a required property
Failed validating 'required' in schema:
{'properties': {'additional': {'type': 'number'},
'name': {'type': 'string'},
'price': {'type': 'number'}},
'required': ['price', 'name', 'additional'],
'type': 'object'}
On instance:
{'name': 'Eggs', 'new': 90, 'price': 34.99}
要使添加more键无效,需要将additionalProperties
设置为false
;默认是允许额外的属性:
schema_data = {
"type" : "object",
"properties" : {
"price" : {"type" : "number"},
"name" : {"type" : "string"},
"additional" : {"type" : "number"},
},
"required": ["price", "name", "additional"],
"additionalProperties": False
}
但是,additional
仍然缺失,当您使用 validate()
时,找不到添加 new
键,因为发现的第一个错误是作为异常引发的。
要获取 所有 模式验证错误,请为模式创建一个验证器对象,然后使用 IValidator.iter_errors()
method 列出所有发现的错误:
from json_schema.validators import validator_for
validator = validator_for(schema_data)(schema_data) # get class, create instance
for error in validator.iter_errors(json_data):
print(error)
现在您将获得有关每个错误的信息:
'additional' is a required property
Failed validating 'required' in schema:
{'additionalProperties': False,
'properties': {'additional': {'type': 'number'},
'name': {'type': 'string'},
'price': {'type': 'number'}},
'required': ['price', 'name', 'additional'],
'type': 'object'}
On instance:
{'name': 'Eggs', 'new': 90, 'price': 34.99}
Additional properties are not allowed ('new' was unexpected)
Failed validating 'additionalProperties' in schema:
{'additionalProperties': False,
'properties': {'additional': {'type': 'number'},
'name': {'type': 'string'},
'price': {'type': 'number'}},
'required': ['price', 'name', 'additional'],
'type': 'object'}
On instance:
{'name': 'Eggs', 'new': 90, 'price': 34.99}
循环中的每个error
对象都是一个ValidatorError
exception object,它有一系列的属性可以帮助你在代码中准确地找出问题所在。
我已经使用 pip install jsonschema
安装了 jsonschema
。
from jsonschema import validate
schema_data = {
"type" : "object",
"properties" : {
"price" : {"type" : "number"},
"name" : {"type" : "string"},
"additional" : {"type" : "number"},
},
}
json_data = {"name" : "Eggs", "price" : 34.99, "new": 90}
我上面的 schema_data
和 json_data
只是验证数据类型。
这里additional
是schema_data
中的额外字段,json_data
中没有,new
存在于json_data
中,json_data
中没有schema_data
.
如何列出缺失的字段,例如 additional
在 json_data
中缺失,new
在 schema_data
?
在 JSON 架构中,默认情况下属性不是 必需的,您的架构所做的只是声明它们必须是什么类型 如果属性 存在 。因此,为了验证标记缺少 additional
,您需要先将该键标记为 a required property,方法是添加一个 required
列表,名称为:
schema_data = {
"type" : "object",
"properties" : {
"price" : {"type" : "number"},
"name" : {"type" : "string"},
"additional" : {"type" : "number"},
},
"required": ["price", "name", "additional"]
}
现在验证将无法通过您的 JSON 数据,因为缺少 additional
:
>>> validate(json_data, schema_data)
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
File "/.../site-packages/jsonschema/validators.py", line 541, in validate
cls(schema, *args, **kwargs).validate(instance)
File "/.../site-packages/jsonschema/validators.py", line 130, in validate
raise error
jsonschema.exceptions.ValidationError: 'additional' is a required property
Failed validating 'required' in schema:
{'properties': {'additional': {'type': 'number'},
'name': {'type': 'string'},
'price': {'type': 'number'}},
'required': ['price', 'name', 'additional'],
'type': 'object'}
On instance:
{'name': 'Eggs', 'new': 90, 'price': 34.99}
要使添加more键无效,需要将additionalProperties
设置为false
;默认是允许额外的属性:
schema_data = {
"type" : "object",
"properties" : {
"price" : {"type" : "number"},
"name" : {"type" : "string"},
"additional" : {"type" : "number"},
},
"required": ["price", "name", "additional"],
"additionalProperties": False
}
但是,additional
仍然缺失,当您使用 validate()
时,找不到添加 new
键,因为发现的第一个错误是作为异常引发的。
要获取 所有 模式验证错误,请为模式创建一个验证器对象,然后使用 IValidator.iter_errors()
method 列出所有发现的错误:
from json_schema.validators import validator_for
validator = validator_for(schema_data)(schema_data) # get class, create instance
for error in validator.iter_errors(json_data):
print(error)
现在您将获得有关每个错误的信息:
'additional' is a required property
Failed validating 'required' in schema:
{'additionalProperties': False,
'properties': {'additional': {'type': 'number'},
'name': {'type': 'string'},
'price': {'type': 'number'}},
'required': ['price', 'name', 'additional'],
'type': 'object'}
On instance:
{'name': 'Eggs', 'new': 90, 'price': 34.99}
Additional properties are not allowed ('new' was unexpected)
Failed validating 'additionalProperties' in schema:
{'additionalProperties': False,
'properties': {'additional': {'type': 'number'},
'name': {'type': 'string'},
'price': {'type': 'number'}},
'required': ['price', 'name', 'additional'],
'type': 'object'}
On instance:
{'name': 'Eggs', 'new': 90, 'price': 34.99}
循环中的每个error
对象都是一个ValidatorError
exception object,它有一系列的属性可以帮助你在代码中准确地找出问题所在。