Разница в результатах валидации с использованием jsonschema и check-jsonschema в отношении поля со значением datetime.

Вопрос или проблема

Разница в результатах валидации с использованием 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 в двух инструментах. Для достижения согласованности, пожалуйста, проверьте формат даты и используйте временные зоны, а также убедитесь, что используемая вами библиотека обновлена до последней версии с актуальными спецификациями.

Оцените материал
Добавить комментарий

Капча загружается...