Словарная схема JSON

#json #jsonschema #ajv

#json #словарь #jsonschema

Вопрос:

У меня есть объект json, который может содержать любое количество вложенных объектов с определенной спецификацией, например:

 {
  "Bob": {
    "age": "42",
    "gender": "male"
  },
  "Alice": {
    "age": "37",
    "gender": "female"
  }
}
  

И хотелось бы, чтобы схема выглядела примерно так:

 {
  "type": "object",
  "propertySchema": {
    "type": "object",
    "required": [
      "age",
      "gender"
    ],
    "properties": {
      "age": {
        "type": "string"
      },
      "gender": {
        "type": "string"
      }
    }
  }
}
  

Я знаю, что могу превратить это в массив и вставить ‘name’ внутри объектов. В этом случае моя схема будет выглядеть так:

 {
  "type": "array",
  "items": {
    "type": "object",
    "required": [
      "name",
      "age",
      "gender"
    ],
    "properties": {
      "name": {
        "type": "string"
      },
      "age": {
        "type": "string"
      },
      "gender": {
        "type": "string"
      }
    }
  }
}
  

но я хотел бы иметь словарную структуру. Возможно ли создать такую схему?

Ответ №1:

additionalProperties ваше ключевое слово:

 {
    "type" : "object",
    "additionalProperties" : {
        "type" : "object",
        "required" : [
            "age",
            "gender"
        ],
        "properties" : {
            "age" : {
                "type" : "string"
            },
            "gender" : {
                "type" : "string"
            }
        }
    }
}
  

additionalProperties может иметь следующие значения с разными значениями:

  • "additionalProperties": false Больше никакие свойства вообще не разрешены.
  • "additionalProperties": true Допускаются другие свойства. Это поведение по умолчанию.
  • "additionalProperties": {"type": "string"} Дополнительные свойства (с произвольным именем) разрешены, если их значение соответствует заданному типу ( "string" здесь).
  • "additionalProperties": {*any schema*} Дополнительные свойства должны удовлетворять предоставленной схеме, такой как приведенный выше пример.

Комментарии:

1. Спасибо за хороший ответ. Я добавил несколько строк, объясняющих различные значения «additionalProperties».

2. Спасибо @JanVlcinsky за улучшение ответа (хотя использование заголовков для фрагментов кода кажется мне немного чрезмерным).

3. Не стесняйтесь редактировать ее по своему усмотрению. Это было причиной, по которой я вас уведомил. Я часто использую заголовки для более наглядной передачи ключевой информации, но, согласен, иногда это может показаться чересчур.