我正在使用jsonschema来验证我的python字典。我正在尝试验证datetime
值,但不确定如何执行。
到目前为止,这就是我所拥有的,由于jsonschema没有datetime
类型,因此会导致错误:
order = {
"name": "shirt",
"order_datetime": datetime.datetime(2018, 1, 18)
}
schema = {
"title": "Order",
"type": "object",
"required": ["name", "order_datetime"],
"properties": {
"name": {
"type": "string"
},
"order_datetime": {
"type": "datetime"
}
}
}
from jsonschema import validate
validate(order, schema)
错误为jsonschema.exceptions.SchemaError: 'datetime' is not valid under any of the given schemas
。如何正确验证呢?
答案 0 :(得分:3)
以下是如何使用本机Python datetime
对象进行正确验证的方法。假设您拥有jsonschema 3.x:
import jsonschema
def validate_with_datetime(schema, instance):
BaseVal = jsonschema.Draft7Validator
# Build a new type checker
def is_datetime(checker, inst):
return isinstance(inst, datetime)
date_check = BaseVal.TYPE_CHECKER.redefine('datetime', is_datetime)
# Build a validator with the new type checker
Validator = jsonschema.validators.extend(BaseVal, type_checker=date_check)
# Run the new Validator
Validator(schema=schema).validate(instance)
答案 1 :(得分:1)
一旦您将 rfc3339-validator
或 strict-rfc3339
添加到项目依赖项中(如我所见,第一个更准确),jsonschema.FormatChecker
类将注册 date-time
格式验证器.所以代码将像它应该的那样简单:
from jsonschema import (
Draft7Validator,
FormatChecker,
)
schema = {
"$schema": "http://json-schema.org/draft-07/schema#",
"type": "object",
"properties": {
"datetime": {
"type": "string",
"format": "date-time"
}
}
}
validator = Draft7Validator(schema, format_checker=FormatChecker())
data_samples = [
{'datetime': '2021-01-01T00:01:02.003+01:00'},
{'datetime': '2021-01-01'},
]
assert validator.is_valid(data_samples[0]) is True
assert validator.is_valid(data_samples[1]) is False
您可以在 jsonschema documentation page 查看其他可能使用的格式、它们需要的库以及其他提示。
答案 2 :(得分:0)
您可以使用__str__
的内置datetime.datetime
方法,将其转换为字符串,该字符串应与JSON一起使用:
dt_string = str(datetime.datetime(2018, 1, 18))
order = {
"name": "shirt",
"order_datetime": dt_string
}
schema = {
"title": "Order",
"type": "object",
"required": ["name", "order_datetime"],
"properties": {
"name": {
"type": "string"
},
"order_datetime": {
"type": "datetime"
}
}
}
from jsonschema import validate
validate(order, schema)
答案 3 :(得分:0)
借助@speedplane的答案,我能够使类型检查器适用于order_datetime的情况。
order = {
"name": "shirt",
"order_datetime": "2019-09-13-22.30.00.000000"
}
schema = {
"title": "Order",
"type": "object",
"required": ["name", "order_datetime"],
"properties": {
"name": {
"type": "string"
},
"order_datetime": {
"type": "orderdatetime"
}
}
}
Python代码
import jsonschema
def validate_with_datetime(schema, instance):
BaseVal = jsonschema.Draft7Validator
# Build a new type checker
def is_datetime(checker, inst):
try:
datetime.datetime.strptime(inst, '%Y-%m-%d-%H.%M.%S.%f')
return True
except ValueError:
return False
date_check = BaseVal.TYPE_CHECKER.redefine(u'orderdatetime', is_datetime)
# Build a validator with the new type checker
Validator = jsonschema.validators.extend(BaseVal, type_checker=date_check)
# Run the new Validator
Validator(schema=schema).validate(instance)
validate_with_datetime(schema, order)
但是在探索jsonschema库时,我遇到了FormatChecker()。 我们不能使用jsonschema.FormatChecker()验证datetime类型属性的格式吗?
@speedplane您能张贴一个示例如何使用FormatChecker()吗?