Как бы вы разработали 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