代码之家  ›  专栏  ›  技术社区  ›  Johnny Metz

使用python jsonschema验证日期时间值

  •  0
  • Johnny Metz  · 技术社区  · 6 年前

    我在用 jsonschema 验证我的python字典。我正在验证一个 datetime 但我不知道该怎么做。

    到目前为止,我得到的是一个错误,因为jsonschema没有 约会时间 类型:

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

    1 回复  |  直到 6 年前
        1
  •  13
  •   speedplane    4 年前

    下面是如何使用本机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)
    
        2
  •  2
  •   Golikov Ivan    3 年前

    一旦你加上 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

        3
  •  1
  •   ankitj    5 年前

    借助@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类型属性的格式?

    @你能举一个例子说明如何使用FormatChecker()吗?