Подтвердить что ты не робот

JSON Schema, чтобы указать схему "любого" типа с определенными обязательными полями

Скажем, у меня есть следующая схема JSON

{
 "name":"Product",
 "type":"object",
 "properties":{
   "id":{
     "type":"number",
     "required":true
   },
   "name":{
     "description":"Name of the product",
     "required":true
   },
   "price":{
     "required":true,
     "type": "number",
     "minimum":0,
     "required":true
   },
   "tags":{
     "type":"array",
     "items":{
       "type":"any"
     }
   }
 }
}

Но вместо того, чтобы теги были массивом, я хотел бы, чтобы он был частью корневой схемы. Таким образом, вы можете указать любое свойство, но я уделяю особое внимание "id", "name" и "price", Какое из следующего было бы правильным способом сделать это, и какие из них совершенно неправы?

{
 "name":"Product",
 "type":"object",
 "properties":{
   "id":{
     "type":"number",
     "required":true
   },
   "name":{
     "description":"Name of the product",
     "required":true
   },
   "price":{
     "required":true,
     "type": "number",
     "minimum":0,
     "required":true
   }
 },
 "additionalProperties": {
     "type":"any"
 }
}

{
 "name":"Product",
 "type":"object",
 "properties":{
   "id":{
     "type":"number",
     "required":true
   },
   "name":{
     "description":"Name of the product",
     "required":true
   },
   "price":{
     "required":true,
     "type": "number",
     "minimum":0,
     "required":true
   }
 },
 "extends": {
     "type":"any"
 }
}

{
 "name":"Product",
 "type":["object","any"],
 "properties":{
   "id":{
     "type":"number",
     "required":true
   },
   "name":{
     "description":"Name of the product",
     "required":true
   },
   "price":{
     "required":true,
     "type": "number",
     "minimum":0,
     "required":true
   }
 }
}

Я могу придумать еще несколько (например, инвертировать роли "любой" и "объект" ), но все они являются производными от этих трех примеров.

4b9b3361

Ответ 1

[отказ от ответственности: автор следующей спецификации проверки JSON Schema здесь]

ОК, непонятно, что вы просите, см. ниже, но один из ваших примеров явно не делает то, что вы хотите, это тот, на котором вы пишете:

{ "type": [ "object", "any" ] }

Это эквивалентно пустой схеме и, как таковая, проверяет каждый экземпляр.

Один из способов, которым я читаю ваш вопрос, состоит в том, что вы хотите, чтобы ваши данные JSON были либо массивом тегов, либо объектом с хотя бы членами с именем id, name и price. Поскольку вы, кажется, используете проект v3, у вас есть только одно решение:

{
    "type": [
        {
            "description": "schema for tags array here",
        },
        {
            "description": "schema for the base object here"
        }
    ]
}

Эта конструкция означает, что экземпляр должен подчиняться хотя бы одной схеме внутри type (и вы также можете смешивать ее с примитивными типами).

Однако: текущий черновик теперь v4, вы должны теперь написать:

{
    "anyOf": [
        {
            "description": "schema for tags array here",
        },
        {
            "description": "schema for the base object here"
        }
    ]
}

Обратите внимание, что не все реализации поддерживают проект v4 или конструкцию для type выше. На самом деле, очень немногие делают. См. Ниже ссылку на онлайн-валидатор схемы, который поддерживает оба.

Еще один способ, которым я прочитал ваш вопрос, - это разрешить свойства, отличные от id, name и price, как они есть. Это довольно просто. Просто не определяйте схему для tags в properties:

{
    "type": "object",
    "required": [ "id", "name", "price" ]
    "properties": {
        "id": {
            "type": "number"
        },
        "name": {
            "description": "Name of the product"
        },
        "price": {
            "type": "number",
            "minimum": 0
        }
    }
}

Поскольку вы не указываете additionalProperties как false, экземпляр объекта может иметь любое количество дополнительных членов, и эти члены могут быть любыми.

Ссылка на онлайн-валидатор, который может проверить ваши схемы: здесь