Как бы вы разработали JSON Schema для произвольного ключа?
У меня есть следующие выходные данные JSON:
{
"label_name_0" : 0,
"label_name_5" : 3,
.
.
.
"label_name_XXX" : 4
}
Вывод прост: имя ключа [1], связанное с целым значением. Если имя ключа не изменяется, я могу легко придумать схему JSON, похожую на это:
{
"type": "array"
"title": "Data output",
"items" :{
"properties": {
"label_name": {
"type": "integer",
"default": 0,
"readonly": True,
}
}
},
Так как имя ключа не известно и продолжает меняться, я должен разработать схему для него. Единственное, что я знаю, это то, что ключ string
и не более 100 символов. Как определить схему JSON для ключа lable_name_xxx
, который продолжает меняться.
[1] Не уверен, что я использую правильную терминологию
Ответы
Ответ 1
На json-schema.org вы найдете что-то подходящее в разделе Дополнительные примеры. Вы можете определить patternProperties
внутри object
.
{
"type": "object",
"properties": {
"/": {}
},
"patternProperties": {
"^(label_name_[0-9]+)+$": { "type": "integer" }
},
"additionalProperties": false,
}
Регулярное выражение (label_name_[0-9]+)+
должно соответствовать вашим потребностям. В JSON Schema регулярные выражения явно привязаны к ^
и $
. Регулярные выражения определяют, что должно быть хотя бы одно свойство (+
). Свойство состоит из label_name_
и числа между 0
и 9
, тогда как должно быть хотя бы одно число ([0-9]+)
, но также может быть выполнено произвольное множество из них.
Установив additionalProperties
в false
, он ограничивает свойства объекта соответствующими регулярным выражениям.
Ответ 2
Как заявил Конрад, используйте patternProperties
. Но вместо properties
используйте вместо properties
, и я думаю, что Конрад просто вставил из своего ссылочного примера, который ожидал путь, начинающийся с /
. В приведенном ниже примере совпадение шаблона regex .*
принимает любое имя свойства, и я разрешаю типы string или null только с помощью "additionalProperties": false
.
"patternProperties": {
"^.*$": {
"anyOf": [
{"type": "string"},
{"type": "null"}
]
}
},
"additionalProperties": false