我正在创建一个json模式,目的是生成单个产品代码数组或产品代码数组的数组。简而言之,我希望能够返回productCodes:[12224, 444444]或productCodesArray:[[12222,55555],[11111,99999]]的结果。我尝试了一个解决方案,部分工作,但允许两者。被允许。我可能读错了说明书,我该怎么做?我尝试使用oneOf,这是我的解决方案:
{
"$schema": "http://json-schema.org/draft-07/schema#",
"$id":"https://examples.com/schemas/my-array-schema",
"type":"object",
"required": ["productCodesResult"],
"properties": {
"additionalItems": false,
"productCodesResult": {
"type": "object",
"properties": {
"oneOf": {
"reasons": {
"$ref": "#/definitions/productCodesDef"
},
"reasonsArray": {
"$ref": "#/definitions/productCodesArrayDef"
}
}
}
}
},
"definitions": {
"productCodesDef": {
"type": "object",
"required": ["productCodes"],
"properties":{
"productsIds": {
"type": "array",
"items": {
"type": "integer",
"minItems": 1
}
}
}.
},
"productCodesArrayDef": {
"type": "object",
"required": ["reasonsArray"],
"properties":{
"productsCodesArray": {
"type": "array",
"items": {
"type": "array",
"items":{
"type": "integer",
"minItems": 1
}
}
}
}
}
}
}
用Ajv进行了测试。在productCodes
属性级别上指定oneOf
。添加两个选项,一个接受一个字符串数组(string[]
),另一个接受一个字符串数组的数组(string[][]
)。
const schema = {
type: 'object',
required: ['productCodes'],
properties: {
productCodes: {
type: 'array',
oneOf: [
{
type: 'array',
minItems: 1,
items: {
type: 'string',
},
},
{
type: 'array',
minItems: 1,
items: {
type: 'array',
minItems: 1,
items: {
type: 'string',
},
},
},
],
},
},
};
不需要给属性不同的名字,只要叫它productCodes
。在上面的例子中,我将它设置为必须的,因此传递空对象将无效。
import Ajv from 'ajv';
const data = {
// productCodes: ['123', '345'],
productCodes: [
['123', '345'],
['123', '345'],
],
};
const validate = this.ajv.compile(schema);
const valid = validate(data);
console.log(valid);
如果出于某种需求的属性必须有不同的名称,然后将他们定义为两个不同的属性。在根级别使用oneOf
可以使它们互斥。productCodes
或productCodesArray
必须存在。
const schema = {
type: 'object',
required: [],
properties: {
productCodes: {
type: 'array',
minItems: 1,
items: {
type: 'string',
},
},
productCodesArray: {
type: 'array',
minItems: 1,
items: {
type: 'array',
minItems: 1,
items: {
type: 'string',
},
},
},
},
oneOf: [
{ type: 'object', required: ['productCodes'] },
{ type: 'object', required: ['productCodesArray'] },
],
};
作为一种选择,您也可以使用allOf
和not
来执行此操作。
const schema = {
type: 'object',
required: [],
properties: {
productCodes: { ... }
productCodesArray: { ... }
},
allOf: [
{
not: {
type: 'object',
required: ['productCodes', 'productCodesArray'],
},
},
],
};