Json Schema oneOf,没有按预期工作



我正在创建一个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可以使它们互斥。productCodesproductCodesArray必须存在。

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'] },
],
};

作为一种选择,您也可以使用allOfnot来执行此操作。

const schema = {
type: 'object',
required: [],
properties: {
productCodes: { ... }
productCodesArray: { ... }
},
allOf: [
{
not: {
type: 'object',
required: ['productCodes', 'productCodesArray'],
},
},
],
};

最新更新