Организация питонических словарей для проверки схемы JSON - PullRequest
0 голосов
/ 19 марта 2019

Сценарий: Я пытаюсь создать валидатор схемы JSON в python.В этом случае я создаю словарь, содержащий информацию, которая будет использоваться для проверки.

Код:

import json
import os
from pprint import pprint
from jsonschema import validate
from jsonschema import Draft4Validator

config_dir = r"D:\PROJECTS\etc"
config_file = r"schema.json"

schema = dict()

schema["$schema"] = "https://json-schema.org/schema#"
schema["title"] = "Index Schema"
schema["description"] = "Schema to describe calendar"
schema["type"] = "object"

# core
core = dict()
core["type"] = "object"
core["description"] = "Core settings for calendar"

core["frequency"] = {"type": "string",
                     "description": "Base frequency ",
                     "enum": ["monthly", "daily", "weekly"]}  #problem1

core["mark"] = {
                "type": "string",
                "description": "Mask defining the months",
                "if": {"core": {"frequency": {"enum": "monthly"}}}, #problem2
                "then": {
                         "pattern": "[01]{12}",
                         "minLength": 12,
                         "maxLength": 12
                         }

                }

core["ref_day"] = {"type": "string",
                   "description": "First day"
                   }

core["objective1"] = {"type": "object",
                     "description": "Information Calendar",
                     "properties": {"day": "string",
                                    "holiday": "string",
                                    "relative": {"unit": ["D", "M", ""],
                                                        "offset": "number"
                                                        }
                                    }
                    }

core["objective2"] = {"type": "object",
                       "description": "Information Calendar 2",
                       "properties":{
                               "day": {
                                       "type": "string",
                                       "value": "string"
                                       },
                               "holiday": "string",
                               "relative": {
                                       "unit": ["D", "M", ""],
                                       "offset": "number"
                                       }
                               }
                       }

core["required"] = ["mark", "ref_day", "frequency", "objective1", "objective2"]

schema["core"] = core

# required
schema["required"] = ["core"]

config_file_path = os.path.join(config_dir, config_file)

with open(config_file_path, 'w') as f:
    json.dump(schema, f, indent=4)

validation_result = Draft4Validator.check_schema(schema)
print(validation_result)

Проблема: Здесь я сталкиваюсь с 3 проблемами: Проблема 1: Можно ли создать список, в котором значение в JSON, которое должно быть проверено, должно быть в этом списке, в противном случае произойдет сбой?

Проблема 2: Можно ли использовать функцию if, как я написал в этом фрагменте?

Проблема 3: Возможно ли уменьшить вероятность ошибок?создать словарь следующим образом (?):

core["holidays"]["properties"]["default"] = {
                                "type": "object",
                                "description": "",
                                "properties":{
                                        "ref",
                                        "type",
                                        "value"
                                        }
                                    }

core["holidays"]["properties"]["interim"] = {"interim": ""}
core["holidays"]["properties"]["selected"] = {"selection": {"ref": "default"}}
core["holidays"]["properties"]["exante"] = {"exante": {"ref": "default"}}
core["holidays"]["properties"]["expost"] = {"expost": {"ref": "default"}}


core["holidays"] = {"type": "object",
                    "description": "Holiday schedule",
                    "properties": {"default", "interim", "selected", "exante", "expost"}
                    }

Основной вопрос: Когда я запускаю первый фрагмент кода, я создаю словарь, и все это работает без потерьошибки, но когда я печатаю результат, я получаю none, который, насколько я понимаю, указывает, что что-то не так.Что я здесь не так делаю?

1 Ответ

1 голос
/ 19 марта 2019

Draft4Validator.check_schema не предназначен для возврата чего-либо. (Другими словами, возвращается None.)

check_schema вызывает исключение, если есть проблема; если нет, он работает до завершения.

Вы можете увидеть это в коде для check_schema:

    @classmethod
    def check_schema(cls, schema):
        for error in cls(cls.META_SCHEMA).iter_errors(schema):
            raise exceptions.SchemaError.create_from(error)

Итак, это поведение правильное.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...