Как бы вы разработали схему JSON для произвольного ключа?

У меня есть следующие выходные данные 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] Не уверен, что использую правильную терминологию.


person Cory    schedule 25.04.2013    source источник
comment
Вы должны принять ответ @Konrad.   -  person jackr    schedule 15.11.2016


Ответы (2)


На json-schema.org вы найдете что-то подходящее в примере файловой системы. раздел. Вы можете определить patternProperties внутри object.

{
    "type": "object",
    "properties": {
        "/": {}
    },
    "patternProperties": {
        "^(label_name_[0-9]+)+$": { "type": "integer" }
    },
    "additionalProperties": false,
 }

Регулярное выражение (label_name_[0-9]+)+ должно соответствовать вашим потребностям. В схеме JSON регулярные выражения явно привязаны к ^ и $. Регулярные выражения определяют, что должно быть хотя бы одно свойство (+). Свойство состоит из label_name_ и числа между 0 и 9, тогда как должно быть хотя бы одно число ([0-9]+), но их также может быть произвольно много.

Установив additionalProperties в false, он ограничивает свойства объекта, чтобы они соответствовали регулярному выражению.

person Konrad Reiche    schedule 19.08.2013
comment
мертвая ссылка. Документация находится по адресу json-schema.org/understanding-json. -схема/ссылка/ - person Matthias Urlichs; 19.03.2019

Как сказано в ответе Конрада, используйте patternProperties. Но используйте вместо properties, что не нужно, и я думаю, что Конрад просто вставил из своего эталонного примера, который ожидал путь, начинающийся с /. В приведенном ниже примере соответствие шаблону regex .* принимает любое имя свойства, и я разрешаю типы строк или null только с помощью "additionalProperties": false.

  "patternProperties": {
    "^.*$": {
      "anyOf": [
        {"type": "string"},
        {"type": "null"}
      ]
    }
  },
  "additionalProperties": false
person pink spikyhairman    schedule 20.02.2017
comment
additionalProperties бесполезен для ограничения типа, он объявлен anyOf. - person xmedeko; 27.07.2021
comment
Шаблон должен быть ^.+$, если имя свойства не должно быть пустым. Затем также необходимо установить "additionalProperties": false. - person xmedeko; 27.07.2021