需要帮助才能找到此架构的错误。它有一个运算符。架构在这里:
`{
"type": "object",
"required": [
"type",
"body"
],
"properties": {
"type": {
"description": "type of the document to post",
"type": "string",
"enum": [
"123",
"456"
]
},
"body": {
"type": "object",
"description": "body",
"oneOf": [{
"$ref": "#/definitions/abc",
"$ref": "#/definitions/def"
}]
}
},
"definitions": {
"abc": {
"type": "array",
"description": "abc",
"properties" : {
"name" : { "type" : "string" }
}
},
"def": {
"type": "array",
"description": "users","properties" : {
"name" : { "type" : "string" }
}
}
}
}`
我的 Json 是这样的:
`{
"type": "123",
"body": {
"abc": [{
"name": "test"
}]
}
}`
它无法使用 tv4 进行验证,我也尝试了这个在线工具。它无需一个运算符即可工作。否则,它不会验证它的任何工具。
编辑 :
阅读答案后,我修改了架构。新架构是:
{
"type": "object",
"properties": {
"type": {
"description": "type of the document to post",
"type": "string",
},
"body": {
"type": "object",
"description": "body",
"properties": {
"customers": {
"type": "array"
}
},
"anyOf": [
{
"title": "customers prop",
"properties": {
"customers": {
"type": "array",
"description": "customers",
"items": {
"type": "object",
"properties": {
"name": {
"type": "string"
}
}
}
}
}
}
]
}
}
}
杰森就在这里
{
"type": "customer",
"body": {
"none": [
{
"name": "test"
}
]
}
}
但它验证了。我想在正文中强制执行"客户"或"用户"之一。为了测试,我已经从身体中删除了用户。
请帮忙。
问题是数据正在传递两个子架构。 oneOf
的意思是"只匹配一个"——如果你想"至少匹配一个",那就用anyOf
事实上,您的两个子架构都将传递所有数据。 原因是在处理数组时忽略properties
。
您可能想要做的是为数组中的项指定属性。 为此,您需要items
关键字:
"definitions": {
"abc": {
"type": "array",
"items": {
"type": "object",
"properties" : {
"name" : { "type" : "string" }
}
}
}
}
(您还需要添加一些不同的约束 - 目前,除了description
之外,"abc"
和"def"
定义都是相同的,这使得oneOf
是不可能的,因为它总是匹配两者或两者都不匹配。
由于您的类型位于根级别,因此您可能希望 oneOf 语句检查类型为"customer"的对象在正文中是否有客户(即使我建议跳过正文并将客户和用户直接放在根对象中)。
这适用于您的示例,将要求类型为"customer"的对象具有带有"customers"的主体,并且为了澄清匹配,我让客户具有属性"name",而用户具有"用户名":
{
"type": "object",
"properties": {
"type": { "type": "string" },
"body": {
"type": "object",
"properties": {
"customers": {
"type": "array",
"items": { "$ref": "#/definitions/customer" }
},
"users": {
"type": "array",
"items": { "$ref": "#/definitions/user" }
}
}
}
},
"definitions": {
"customer": {
"type": "object",
"properties": { "name": { "type": "string" } },
"required": [ "name" ]
},
"user": {
"type": "object",
"properties": { "username": { "type": "string" } },
"required": [ "username" ]
}
},
"oneOf": [
{
"properties": {
"type": {
"pattern": "customer"
},
"body": {
"required": [ "customers" ]
}
}
},
{
"properties": {
"type": {
"pattern": "user"
},
"body": {
"required": [ "users" ]
}
}
}
]
}
使用 "type": "array"
时,项目类型是在 "items"
属性中定义的,而不是"properties"
属性...此外,oneOf
中的两种类型是相同的,但只有一个必须匹配。
尝试
...
"definitions": {
"abc": {
"type": "array",
"description": "abc",
"items" : {
"name" : { "type" : "string" }
}
},
"def": {
"type": "array",
"description": "users",
"items" : {
"username" : { "type" : "string" }
}
}
}