Как проверить действительность файла схемы JSON?

У меня есть файл схемы JSON, подобный этому, который содержит пару преднамеренных ошибок:

{
    "$schema": "http://json-schema.org/schema#",
    "type": "object",
    "description": "MWE for JSON Schema Validation",
    "properties": {
      "valid_prop": {
        "type": ["string", "number"],
        "description": "This can be either a string or a number."
      },
      "invalid_prop": {
        // NOTE: "type:" here should have been "type" (without the colon)
        "type:": ["string", "null"],
        "description": "Note the extra colon in the name of the type property above"
      }
    },
    // NOTE: Reference to a non-existent property
    "required": ["valid_prop", "nonexistent_prop"]
}

Я хотел бы написать сценарий Python (или, что еще лучше, установить CLI с PiP), который может найти эти ошибки.

Я видел этот ответ, в котором предлагается сделать следующее (изменено для моего варианта использования):

import json
from jsonschema import Draft4Validator

with open('./my-schema.json') as schemaf:
    schema = json.loads('\n'.join(schemaf.readlines()))
    Draft4Validator.check_schema(my_schema)
    print("OK!") # on invalid schema we don't get here

но приведенный выше сценарий не обнаруживает ни одной из ошибок в файле схемы. Я бы заподозрил, что он обнаружит по крайней мере лишнее двоеточие в свойстве "type:".

Я неправильно использую библиотеку? Как мне написать сценарий проверки, который обнаруживает эту ошибку?


person Tomas Aschan    schedule 13.01.2020    source источник
comment
Разве нельзя описать JSONschema в JSONschema? Интересно, сделали ли они это где-нибудь в спецификации. Не нашел, пока ковырялся, но меня не удивит, если он существует ...   -  person Tomalak    schedule 13.01.2020
comment
К вашему сведению, schema = json.load(schemaf) - это более лаконичный способ загрузки файла. Даже schema = json.loads(schemaf.read()) было бы лучше, чем читать построчно, просто чтобы снова присоединиться к ним. .readlines() также сохраняет символы новой строки в каждой строке, поэтому объединение с \n создает результаты с двойным интервалом.   -  person Mark Tolonen    schedule 13.01.2020
comment
Из json-schema.org/understanding-json-schema/about.html #about Однако, поскольку схема JSON не может содержать произвольный код, существуют определенные ограничения на отношения между элементами данных, которые не могут быть выражены. Поэтому любой «инструмент проверки» для достаточно сложного формата данных, вероятно, будет иметь две фазы проверки: одну на уровне схемы (или структуры) и одну на семантическом уровне. Последнюю проверку, вероятно, необходимо будет реализовать с использованием более универсального языка программирования. - Итак, да и нет. Хотя ошибки типа "type:" можно было отловить.   -  person Tomalak    schedule 13.01.2020


Ответы (1)


Вы говорите, что схема недействительна, но это не относится к приведенному вами примеру.

Неизвестные ключевые слова игнорируются. Это необходимо для создания расширений. Если бы неизвестные ключевые слова были предотвращены, у нас не было бы экосистемы расширений, созданных различными людьми и группами, таких как создание форм.

Вы говорите, что значение в required является «ссылкой на несуществующее свойство». Ключевое слово required не имеет ссылки на ключевое слово properties.

required определяет, какие ключи должен иметь объект.

properties определяет, как подсхема должна применяться к значениям в объекте.

Нет необходимости, чтобы значения в required также включались в properties. На самом деле, они обычно не делают этого при построении сложных модульных схем.

Что касается проверки правильности схемы, вы можете использовать метасхему JSON Schema.

Что касается проверки дополнительных вещей, которые вы считаете нежелательными, это зависит от вас, учитывая, что приведенные вами примеры действительны.

Некоторые библиотеки могут обеспечивать проверку работоспособности, но вряд ли они уловят предоставленные вами примеры, поскольку они не являются ошибками.

person Relequestual    schedule 14.01.2020