鉴于
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
根据规范(实际上是 JSON Schema 规范的所有版本)
format
未验证。 它仅提供信息(在更高版本中它“生成注释”)。 实现可以选择验证format
,但是除非明确配置,否则应该禁用该功能。
(因此,所有
format
验证测试在官方 JSON 模式测试套件中都列为 可选。)
date-time
、date
和time
格式均指定为指示 RFC3339 格式,您的值不符合该格式。
所以...两者都工作正常,但 python 工作更正确,因为它没有验证
format
。
我建议将其带回 CLI 工具并告诉他们隐藏配置后面的
format
验证。
根据文档,如果没有为验证提供格式检查器,则不会进行格式验证。调用
jsonschema.validate
时,传递 format_checker
关键字参数,以便创建的验证器作为调用结果将成为格式检查器并进行格式验证。
即,
更换线路
jsonschema.validate(m1_as_dict, schema)
与
jsonschema.validate(m1_as_dict, schema, format_checker=jsonschema.FormatChecker())