对于具有 datatime 值的字段,使用 `jsonschema` 和 `check-jsonschema` 验证结果的差异

问题描述 投票:0回答:2

鉴于

model_schema.json

{
  "properties": {
    "dt": {
      "format": "date-time",
      "title": "Dt",
      "type": "string"
    }
  },
  "required": [
    "dt"
  ],
  "title": "Model",
  "type": "object",
  "$schema": "https://json-schema.org/draft/2020-12/schema"
}

model_instance.json

{
  "dt": "2032-04-23T10:20:30"
}

运行以下 Python 脚本不会产生错误。

import json
from pprint import pprint

import jsonschema


with open("model_schema.json") as f:
    schema = json.load(f)

with open("model_instance.json") as f:
    m1_as_dict = json.load(f)


pprint(schema)
print("\n=====================================\n")
pprint(m1_as_dict)


jsonschema.validate(m1_as_dict, schema)

但是,运行以下命令

check-jsonschema --schemafile model_schema.json model_instance.json

产生以下错误

Schema validation errors were encountered.
  model_instance.json::$.dt: '2032-04-23T10:20:30' is not a 'date-time'

我认为该命令的行为是正确的。为什么给定的 Python 脚本不会产生与命令类似的错误?

我的环境是:

check-jsonschema          0.28.2
jsonschema                4.21.1
jsonschema-specifications 2023.12.1
types-jsonschema          4.21.0.20240331
python jsonschema
2个回答
0
投票

根据规范(实际上是 JSON Schema 规范的所有版本)

format
未验证。 它仅提供信息(在更高版本中它“生成注释”)。 实现可以选择验证
format
,但是除非明确配置,否则应该禁用该功能。

(因此,所有

format
验证测试在官方 JSON 模式测试套件中都列为 可选。)

date-time
date
time
格式均指定为指示 RFC3339 格式,您的值不符合该格式。

所以...两者都工作正常,但 python 工作更正确,因为它没有验证

format

我建议将其带回 CLI 工具并告诉他们隐藏配置后面的

format
验证。


0
投票

根据文档,如果没有为验证提供格式检查器,则不会进行格式验证。调用

jsonschema.validate
时,传递
format_checker
关键字参数,以便创建的验证器作为调用结果将成为格式检查器并进行格式验证。

即,

更换线路

jsonschema.validate(m1_as_dict, schema)

jsonschema.validate(m1_as_dict, schema, format_checker=jsonschema.FormatChecker())
© www.soinside.com 2019 - 2024. All rights reserved.