JSON Schema 4 проверяет ровно одно определение - PullRequest
1 голос
/ 13 июня 2019

Я хотел бы, чтобы мое тело HTTP-запроса принимало что-то вроде:

{
    "grant_type": "refresh_token", // "refresh_token" or "password"
    "client_id": "my-client",      // NEVER CHANGE
    "refresh_token": "XXX"
}

или

{
    "grant_type": "password",   // "refresh_token" or "password"
    "client_id": "my-client",   // NEVER CHANGE
    "username": "XXX",
    "password": "XXX",
}

Как видите, изменение формата основано на grant_type. Итак, я определил эту схему:

{
  "definitions": {
    "username_and_password": {
        "type": "object",
        "properties": {
            "grant_type": { "type": "string", "enum": ["password"] },
            "client_id": { "type": "string", "enum": ["my-client"] },
            "username": { "type": "string" },
            "password": { "type": "string" }
        },
        "required": ["grant_type", "client_id", "username", "password" ]
    },
    "refresh_token": {
        "type": "object",
        "properties": {
            "grant_type": { "type": "string", "enum": ["refresh_token"] },
            "client_id": { "type": "string", "enum": ["my-client"] },
            "refresh_token": { "type": "string" }
        },
        "required": [ "grant_type", "client_id", "refresh_token" ]
    }
  },

  "oneOf": [
    { "$ref": "#/definitions/username_and_password" },
    { "$ref": "#/definitions/refresh_token" }
  ],

  "additionalProperties": false
}

Я использую это как модель API-шлюза, но он отрицает все, что я отправляю. Где ошибка?

1 Ответ

1 голос
/ 13 июня 2019

additionalProperties ложь - ваша проблема.

Он не может "видеть сквозь" oneOf или $ref ссылки.

Если "AdditionalProperties" имеет логическое значение false...

В этом случае проверка экземпляра зависит от набора свойств "properties" и "patternProperties".

https://tools.ietf.org/html/draft-fge-json-schema-validation-00#section-5.4.4.4

Естьнемного больше объяснения того, как это работает, и мы разъяснили это для черновика-5 и далее, но по существу ...

additionalProperties применимо ко всем свойствам, которые не определены в properties в той же схемеуровень объекта как additionalProperties.

Поскольку ваша схема имеет только additionalProperties и не определена properties, ВСЕ свойства приводят к сбою проверки.

Вы можете обойти это, определив свойствагде значения каждого являются пустыми схемами.Начиная с draft-5, вы можете использовать true в качестве значения, потому что true и false являются допустимыми "схемами".

...