#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. Не стесняйтесь редактировать ее по своему усмотрению. Это было причиной, по которой я вас уведомил. Я часто использую заголовки для более наглядной передачи ключевой информации, но, согласен, иногда это может показаться чересчур.