Json Schema разные форматы ввода - PullRequest
0 голосов
/ 05 ноября 2019

Я создаю некоторые модели в AWS API Gateway. У меня проблемы с одним, который я хотел бы получить 2 входных формата: один из форматов это просто словарь, другой массив массив словарей:

{
    "id":"",
    "name":""
}

и

[
    {
        "id":"",
        "Family":""
    },
    {
        "id":"",
        "Family":""
    },

    ...

    {
        "id":"",
        "Family":""
    }
]

До сих пор я создавал модель для использования только в словаре:

{  
  "$schema": "http://json-schema.org/draft-04/schema#",
  "title": "Update",
  "type": "object",
  "properties": {
      "id": { "type": "string"},
      "name": { "type": "string"}
  },
  "required": ["id"]
}

Можете ли вы дать мне несколько советов по созданию массива словарей, пожалуйста. Я провел некоторое исследование и ничего не нашел, но следую по пути ключевых слов oneOf и anyOf, но я не уверен.

1 Ответ

1 голос
/ 05 ноября 2019

Вы на правильном пути с anyOf. Что вы должны сделать, зависит от сходства между объектом (словарем), который сам по себе, и объектом, который находится в массиве. Они выглядят по-разному в вашем примере, поэтому я отвечу тем же, а затем покажу, как упростить вещи, если они на самом деле одинаковы.


Чтобы использовать anyOf, вы хотите захватить ключевые словакоторые определяют ваш словарь

{
  "type": "object",
  "properties": {
    "id": { "type": "string"},
    "name": { "type": "string"}
  },
  "required": ["id"]
}

и переносят его в anyOf прямо на корневом уровне схемы

{  
  "$schema": "http://json-schema.org/draft-04/schema#",
  "title": "Update",
  "anyOf": [
    {
      "type": "object",
      "properties": {
        "id": { "type": "string"},
        "name": { "type": "string"}
      },
      "required": ["id"]
    }
  ]
}

Чтобы написать схему для массива объекта того же типа, вам нужно ключевое слово items.

{
  "type": "array",
  "items": {
    "type": "object",
    "properties": {
      "id": { "type": "string"},
      "Family": { "type": "string"}
    },
    "required": ["id"]
  }
}

Добавьте его в качестве второго элемента в массиве anyOf, и вы получите золотой.


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

{
  "$schema": "http://json-schema.org/draft-04/schema#",
  "title": "Update",
  "definitions": {
    "myObject": {
      "type": "object",
      "properties": {
        "id": { "type": "string"},
        "name": { "type": "string"}
      },
      "required": ["id"]
    }
  },
  "anyOf": [
    { "$ref": "#/definitions/myObject" },
    {
      "type": "array",
      "items": { "$ref": "#/definitions/myObject" }
    }
  ]
}
...