繁体   English   中英

使用 python jsonschema 验证日期时间值

[英]Validate datetime value using python jsonschema

我正在使用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 我怎样才能正确地验证这一点?

以下是如何使用本机 Python datetime对象正确验证。 假设您有 jsonschema 3.x:

from datetime import datetime
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)

在@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() 来验证日期时间类型属性的格式吗?

@speedplane 你能发布一个如何使用 FormatChecker() 的例子吗?

一旦您将rfc3339-validatorstrict-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 文档页面查看其他可能使用的格式、它们需要的库以及其他提示。

我正在使用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 如何正确验证?

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM