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" }
}
如果你不能将可变项移动到最后,那你就倒霉了。
我正在尝试定义一个模式来验证这种类型的数据数组:
[
'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" }
}
如果你不能将可变项移动到最后,那你就倒霉了。