Объединение свойств из двух объектов схемы JSON - PullRequest
0 голосов
/ 25 апреля 2018

Я пишу некоторые JSON-схемы, которые имеют некоторые объекты с общими свойствами.

в JSON-схеме 1:

...
"properties": {
    "someProperty": {
        "type": "object",
        "required": [
            "propertyA",
            "propertyB",
            "propertyC",
        ],
        "additionalProperties": false,
        "properties": {
            "propertyA": {
                "type": "integer"
            },
            "propertyB": {
                "type": "integer"
            },
            "propertyC": {
                "type": "integer"
            }
        }
    }
}
...

в JSON-схеме 2:

...
"properties": {
    "someProperty": {
        "type": "object",
        "required": [
            "propertyD",
            "propertyB",
            "propertyC",
        ],
        "additionalProperties": false,
        "properties": {
            "propertyD": {
                "type": "integer"
            },
            "propertyB": {
                "type": "integer"
            },
            "propertyC": {
                "type": "integer"
            }
        }
    }
}
...

Таким образом, единственное различие между этими двумя объектами (someProperty) состоит в propertyA против propertyD.

Поэтому я решил создать общую схему JSON, которая будет содержать определение для этих двух общихproperties, propertyB и propertyC.

Одним из решений было определение объекта в общей схеме, который бы содержал эти два свойства, но я хотел, чтобы мой JSON имел эти три свойства одновременноуровень (плоский, развернутый), а не вот так:

"someProperty": {
    "propertyA": 2,
    "sharedObject": {
        "propertyB": 3,
        "propertyC": 4
    }
}

Возможно ли то, что я хочу?Я хочу закончить тем, что мой JSON будет действительным, например:

"someProperty": {
    "propertyA": 2,
    "propertyB": 3,
    "propertyC": 4
}

и:

"someProperty": {
    "propertyD": 2,
    "propertyB": 3,
    "propertyC": 4
}

Со всеми этими свойствами как required и нет additionalProperties разрешено.

1 Ответ

0 голосов
/ 27 апреля 2018

Вы можете достичь этого с помощью oneOf. oneOf является эксклюзивным оператором ИЛИ. Один или другой из «propertyA» или «propertyD», но не оба могут присутствовать одновременно.

{
  "type": "object",
  "properties": {
    "someProperty": {
      "type": "object",
      "properties": {
        "propertyA": {
          "type": "integer"
        },
        "propertyB": {
          "type": "integer"
        },
        "propertyC": {
          "type": "integer"
        },
        "propertyD": {
          "type": "integer"
        }
      },
      "required": ["propertyB", "propertyC"],
      "oneOf": [
        { "required": ["propertyA"] },
        { "required": ["propertyD"] }
      ],
      "additionalProperties": false
    }
  }
}
...