JsonSchema не проверяется с одним
Нужна помощь, чтобы найти ошибку с этой схемой. У него есть один оператор. Схема здесь:
`{
"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"
}
]
}
}
Но это подтверждает. Я хочу, чтобы один из "клиентов" или "пользователей" был задействован в теле. Для проверки я удалил пользователей из тела.
Пл помогите.
3 ответа
Поскольку у вас есть тип на корневом уровне, вы, вероятно, хотите, чтобы оператор oneOf проверял, что в теле объекта с типом "customer" есть клиенты (даже если бы я предложил пропустить тело и поместить клиентов и пользователей непосредственно в корневой объект).
Это работает с вашим примером, потребует, чтобы объект с типом "customer" имел тело с "Customers", и чтобы уточнить соответствие, я позволю customer иметь свойство "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" ]
}
}
}
]
}
Проблема в том, что данные проходят обе ваши подсхемы. oneOf
означает "соответствовать ровно одному" - если вы хотите "соответствовать хотя бы одному", используйте anyOf
,
Фактически обе ваши подсхемы будут передавать все данные. Причина в том, что properties
игнорируется при работе с массивами.
Предположительно, вместо этого вы хотели указать свойства для элементов в массиве. Для этого вам нужно items
ключевое слово:
"definitions": {
"abc": {
"type": "array",
"items": {
"type": "object",
"properties" : {
"name" : { "type" : "string" }
}
}
}
}
(Вам также необходимо добавить некоторые четкие ограничения - на данный момент оба "abc"
а также "def"
определения идентичны, кроме description
, что делает oneOf
невозможно, потому что это всегда будет соответствовать обоим или ни одному.)
Когда используешь "type": "array"
затем тип элемента определяется в "items"
собственность не "properties"
свойство... Также оба типа в oneOf
одинаковы, но только один должен соответствовать.
Пытаться
...
"definitions": {
"abc": {
"type": "array",
"description": "abc",
"items" : {
"name" : { "type" : "string" }
}
},
"def": {
"type": "array",
"description": "users",
"items" : {
"username" : { "type" : "string" }
}
}
}