Вопрос или проблема
Разница в результатах валидации с использованием jsonschema
и check-jsonschema
в отношении поля со значением datetime.
Дан файл 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
вызывает следующую ошибку
Обнаружены ошибки валидации схемы.
model_instance.json::$.dt: '2032-04-23T10:20:30' не является 'date-time'
Я считаю, что поведение команды правильное. Почему данный Python-скрипт не выдает аналогичную ошибку, как команда?
Моя среда:
check-jsonschema 0.28.2
jsonschema 4.21.1
jsonschema-specifications 2023.12.1
types-jsonschema 4.21.0.20240331
Ответ или решение
Ваша ситуация касается различий в валидации JSON-схемы с использованием библиотеки jsonschema
и утилиты check-jsonschema
. Чтобы понять, почему скрипт на Python не выдает ошибки, тогда как команда check-jsonschema
сообщает об ошибке, необходимо рассмотреть несколько аспектов.
1. Стандарты валидации
Библиотека jsonschema
, используемая в вашем скрипте, поддерживает спецификацию JSON Schema Draft 2020-12, как указано в вашем файле схемы. Однако обработка формата date-time
может зависеть от версии библиотеки и её внутренних реализаций. Следует отметить, что строки, соответствующие формату date-time
, должны помещаться в чётко определённый формат (RFC 3339). В вашем случае строка '2032-04-23T10:20:30'
выглядит правильной, однако сам jsonschema
может не проверять все возможные нюансы формата.
С другой стороны, утилита check-jsonschema
, вероятно, выполняет более строгую проверку или использует другую версию проверки формата, что и приводит к ошибке.
2. Формат date-time
По спецификации date-time
, строки должны включать информацию о временной зоне (например, Z
для UTC или смещение как +00:00
). Фраза '2032-04-23T10:20:30'
не содержит таких данных и может быть игнорирована валидацией jsonschema
. Это и могло привести к тому, что ваш Python скрипт не выдает ошибку.
3. Рекомендации для исправления
Чтобы убедиться в корректности валидации и устранить несоответствия, вы можете попробовать следующее:
-
Добавьте временную зону к строкам
date-time
: например, измените значение на'2032-04-23T10:20:30Z'
, чтобы указать, что время представлено в UTC. -
Проверьте зависимости: Убедитесь, что версия
jsonschema
в вашем окружении действительно поддерживает проверки форматаdate-time
с учётом всех нюансов. Вы можете протестировать это, запустив простой тест на валидацию строки, и посмотреть, выдает ли библиотека ожидаемые ошибки. - Используйте другой подход к проверке: Если ваше приложение критически зависит от строгой валидации, рассмотрите возможность использования
check-jsonschema
в качестве основного инструмента для перевода данных в соответствии с спецификацией JSON Schema.
Заключение
Ваша проблема заключается в различной интерпретации формата date-time
в двух инструментах. Для достижения согласованности, пожалуйста, проверьте формат даты и используйте временные зоны, а также убедитесь, что используемая вами библиотека обновлена до последней версии с актуальными спецификациями.