Как изменить схему json на основе существования свойства? - PullRequest
0 голосов
/ 09 января 2020

Моя цель - изменить схему на основе существования свойства.
Это мои схемы:

sample = {
    "type": "object",
    "properties": {
        "description": {"type": "string", "minLength": 1, "pattern": "^.*\w+.*$"},
        "owner_id": {"type": "string"},
        "privacy_setting": {"type": "string", "enum": ["private","group","account","public"]},
        "iam": iam,
        "timestamp": {"type": "integer", "minimum": 1000000000000, "maximum": 9999999999999},
        "protocols": {"type": "array", "items": protocol},
        "measurements": {"type": "array", "items": measurement}
    },
    "required": ["description","owner_id"],
    "additionalProperties": False
}

existing_sample = {
    "type": "object",
    "properties": {
        "id": {"type": "string"},
        "protocols": {"type": "array", "items": protocol},
        "measurements": {"type": "array", "items": measurement}
    },
    "required": ["id"],
    "additionalProperties": False
}

# final schema
final = {
    "type": "object",
    "patternProperties": {
        "^.+$": {
            "if": {
                "properties": {
                    "id": {"type": "string"}
                }
            },
            "then": existing_sample,
            "else": sample
        }
    },
    "additionalProperties": False
}

Идея состоит в том, чтобы следовать схеме «isting_sample »в случае, если свойство« id »существует и следуйте "примерной" схеме, если она отсутствует.

Это работает, как и ожидалось, когда существует "id", что означает, что если появляется неуказанное свойство, оно вызовет исключение:

Дополнительные свойства не допускаются

но если свойство "id" отсутствует, оно выдаст исключение:

'id' является обязательным свойством

, как будто оно все еще следует за Схема «существующего_ образца».

есть идеи?

1 Ответ

0 голосов
/ 09 января 2020

Видимо, мое состояние не было правильным. Мне нужно было требовать свойство "id" вместо простого указания схемы свойства "id".
Следующее работает, как и ожидалось:

# existing sample schema
existing_sample = {
    "type": "object",
    "properties": {
        "id": {"type": "string"},
        "protocols": {"type": "array", "items": protocol},
        "measurements": {"type": "array", "items": measurement}
    },
    "required": ["id"],
    "additionalProperties": False
}


# sample schema
sample = {
    "type": "object",
    "properties": {
        "owner_id": {"type": "string"},
        "description": {"type": "string", "minLength": 1, "pattern": "^.*\w+.*$"},
        "privacy_setting": {"type": "string", "enum": ["private","group","account","public"]},
        "iam": iam,
        "timestamp": {"type": "integer", "minimum": 1000000000000, "maximum": 9999999999999},
        "protocols": {"type": "array", "items": protocol},
        "measurements": {"type": "array", "items": measurement}
    },
    "required": ["description","owner_id"],
    "additionalProperties": False
}

# condition to choose between existing sample schema to new sample schema
# based on "id" property appearance
condition = {
    "type": "object",
    "if": {
        "required": ["id"],
    },
    "then": existing_sample,
    "else": sample
}

# final schema
final = {
    "type": "object",
    "patternProperties": {
        "^.+$": condition
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...