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"  }
            }
        }
    }
Другие вопросы по тегам