JSON схема для массива переменной длины с некоторыми фиксированными элементами - PullRequest
1 голос
/ 02 августа 2020

Я пытаюсь определить схему для проверки этого типа массива данных:

[ 
'item1 string',         // item1, being a given string
2,                      // item2, an integer
'item3 string',         // item3, a variable string, repeated N times
'another item3 string', // ...
...
'last item3 string',    //
1.1,                    // item4, a number
]

item3 - это набор строк, который может быть разным. Без повторения упрощенная версия моей схемы:

{
  type: 'array',
  minItems: 4,
  maxItems: 4,
  items: [
    { $ref: '#/definitions/item1' },
    { $ref: '#/definitions/item2' },
    { $ref: '#/definitions/item3' },
    { $ref: '#/definitions/item4' },
  ],
  definitions: {
    item1: { type: 'string' },
    item2: { type: 'integer' },
    item3: { type: 'string' },
    item4: { type: 'number' },
  },
}

Я хочу, чтобы моя секция «items» была массивом, так как я хочу убедиться, что элементы упорядочены правильно. Но я не понимаю, как описать повторение элементов «item3».

На самом деле я заранее знаю количество ожидаемых вхождений «item3», поэтому прямо сейчас я перестраиваю схему для каждой проверки ( настройка mix / maxItems и повторение раздела item3).

Но есть ли более эффективный способ сделать это? Эта схема используется в nodejs / ajv, есть ли функция ajv, которая могла бы помочь, если это невозможно внутри схемы? Спасибо.

1 Ответ

0 голосов
/ 03 августа 2020

Это не то, что может быть выражено схемой JSON. Если бы элементы массива переменной длины пришли последними, это можно было бы сделать. Предполагая, что можно переместить элемент 4 перед элементом 3, вы можете сделать это ...

{
  "type": "array",
  "items": [
    { "$ref": "#/definitions/item1" },
    { "$ref": "#/definitions/item2" },
    { "$ref": "#/definitions/item4" }
  ],
  "additionalItems": { "$ref": "#/definitions/item3" }
}

Если вы не можете переместить переменные элементы в конец, вам не повезло.

...