Python jsonschema, не разрешающий ничего, или требующий одно и только одно из двух полей - PullRequest
3 голосов
/ 07 ноября 2019

Я работаю с jsonschema для Python и пытаюсь разрешить любое из следующего:

{}
# or
{
    'id': 'd6a4def3-4a6a-4fb4-a38e-f98ea48f708a'
}
# or
{
    'status': 'Done'
}

, но я не хочу разрешать следующее, поскольку оба поля указаны:

{
    'id': 'd6a4def3-4a6a-4fb4-a38e-f98ea48f708a',
    'status': 'Done'
}

Это то, что у меня есть, которое позволяет предоставлять одно или другое поле так, как я хочу, но ничего не позволяет.

GET_CALL = {
    "type": "object",
    "additionalProperties": False,
    "properties": {
        "id": {
            "type": "string",
            "pattern": REGEX_EXPRESSIONS['UUID4'], # Matches a UUID4 format
        },
        "status": {
            "type": "string",
            "enum": ["Done", "Ready"],
        },
    },
    "oneOf": [ # This makes it so I can only have one or the other but it doesn't allow nothing.
        {"required": ["id"]},
        {"required": ["status"]}
    ],
}

1 Ответ

2 голосов
/ 07 ноября 2019

Вам нужен oneOf, чтобы покрыть все дела. К счастью, это не слишком сложно.

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

{
  "oneOf": [
    {
      "additionalProperties": false
    },
    {
      "required": [
        "id"
      ]
    },
    {
      "required": [
        "status"
      ]
    }
  ]
}

(схема JSON черновика-7)

Вы можете проверить это по jsonschema.dev (ссылка предварительнозагружен с этой схемой и экземпляром теста)

...