JSON 具有一些固定项的可变长度数组的架构

JSON schema for variable length array with some fixed items

我正在尝试定义一个模式来验证这种类型的数据数组:

[ 
'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' },
  },
}

我希望我的“项目”部分是一个数组,因为我想确保项目以正确的方式排序。但是我不知道如何描述“item3”元素的重复。

我实际上事先知道我期望的“item3”出现次数,所以现在我为每次检查重建架构(调整 mix/maxItems,并重复 item3 部分)。

但是有没有更有效的方法来解决这个问题?此架构用于 nodejs / ajv,如果这在架构内不可行,是否有 ajv 功能会有所帮助? 谢谢。

这不是JSON Schema 可以表达的东西。如果可变长度数组项排在最后,则可以完成。假设可以将 item4 移到 item3 之前,您可以这样做...

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

如果你不能将可变项移动到最后,那你就倒霉了。