JsonSchema 未使用 oneOf 进行验证
JsonSchema is not validated with oneOf
需要帮助来查找此架构的错误。它有一个运算符。
架构在这里:
`{
"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 进行验证,我也试过了 online tool。它在没有 oneOf 运算符的情况下工作。否则它不会验证任何工具。
编辑:
阅读答案后我修改了架构。新架构是:
{
"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"
}
}
}
}
}
}
]
}
}
}
并且 json 在这里
{
"type": "customer",
"body": {
"none": [
{
"name": "test"
}
]
}
}
但它有效。我想在正文中强制执行 "customers" 或 "users" 之一。为了测试,我已经从正文中删除了用户。
请帮忙。
当使用 "type": "array"
时,项目类型在 "items"
属性 而不是 "properties"
属性... 14=]相同,但必须只有一个匹配。
尝试
...
"definitions": {
"abc": {
"type": "array",
"description": "abc",
"items" : {
"name" : { "type" : "string" }
}
},
"def": {
"type": "array",
"description": "users",
"items" : {
"username" : { "type" : "string" }
}
}
}
问题是数据正在传递您的两个子模式。 oneOf
表示 "match exactly one" - 如果您想要 "match at least one",则使用 anyOf
。
事实上,您的两个子模式都将传递所有数据。原因是在处理数组时忽略了properties
。
您可能想要做的是为数组中的 items 指定属性。为此,您需要 items
关键字:
"definitions": {
"abc": {
"type": "array",
"items": {
"type": "object",
"properties" : {
"name" : { "type" : "string" }
}
}
}
}
(您还需要添加一些不同的约束 - 目前,"abc"
和 "def"
的定义除了 description
之外是相同的,这使得 oneOf
不可能,因为它总是匹配或都不匹配。)
由于您在根级别拥有类型,您可能希望 oneOf 语句检查类型为 "customer" 的对象在正文中是否有客户(尽管我建议跳过正文并将客户和直接在根对象中的用户)。
这适用于您的示例,要求类型为 "customer" 的对象具有 "customers" 的主体,为了阐明匹配,我让客户拥有 属性 "name" 而用户有 "username":
{
"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": "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 进行验证,我也试过了 online tool。它在没有 oneOf 运算符的情况下工作。否则它不会验证任何工具。
编辑:
阅读答案后我修改了架构。新架构是:
{
"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"
}
}
}
}
}
}
]
}
}
}
并且 json 在这里
{
"type": "customer",
"body": {
"none": [
{
"name": "test"
}
]
}
}
但它有效。我想在正文中强制执行 "customers" 或 "users" 之一。为了测试,我已经从正文中删除了用户。
请帮忙。
当使用 "type": "array"
时,项目类型在 "items"
属性 而不是 "properties"
属性... 14=]相同,但必须只有一个匹配。
尝试
...
"definitions": {
"abc": {
"type": "array",
"description": "abc",
"items" : {
"name" : { "type" : "string" }
}
},
"def": {
"type": "array",
"description": "users",
"items" : {
"username" : { "type" : "string" }
}
}
}
问题是数据正在传递您的两个子模式。 oneOf
表示 "match exactly one" - 如果您想要 "match at least one",则使用 anyOf
。
事实上,您的两个子模式都将传递所有数据。原因是在处理数组时忽略了properties
。
您可能想要做的是为数组中的 items 指定属性。为此,您需要 items
关键字:
"definitions": {
"abc": {
"type": "array",
"items": {
"type": "object",
"properties" : {
"name" : { "type" : "string" }
}
}
}
}
(您还需要添加一些不同的约束 - 目前,"abc"
和 "def"
的定义除了 description
之外是相同的,这使得 oneOf
不可能,因为它总是匹配或都不匹配。)
由于您在根级别拥有类型,您可能希望 oneOf 语句检查类型为 "customer" 的对象在正文中是否有客户(尽管我建议跳过正文并将客户和直接在根对象中的用户)。
这适用于您的示例,要求类型为 "customer" 的对象具有 "customers" 的主体,为了阐明匹配,我让客户拥有 属性 "name" 而用户有 "username":
{
"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" ]
}
}
}
]
}