web-dev-qa-db-ja.com

値に対するJSONスキーマの条件付き依存関係

ここにも同様の質問があることは知っていますが、それは私の問題に実際には対処していませんでした。つまり、一方のフィールドをもう一方のフィールドの値に依存させたいのです。ただし、一部の値については、フィールドを必須にしたくありません。次に例を示します。

スキーマ

{
  "definitions": {},
  "$schema": "http://json-schema.org/draft-04/schema#",
  "type": "object",
  "properties": {

    "colour": {
      "type": "string",
      "enum": ["red", "black", "blue"]
    },

    "blackQuote": {
      "type": "string",
      "maxLength": 11
    },

    "redQuote": {
      "type": "string",
      "maxLength": 11
    }
  },

  "oneOf": [
      {
        "properties": {
          "colour": {"enum": ["red"]}
        },
        "required": ["redQuote"]
      },
      {
        "properties": {
          "colour": {"enum": ["black"]}
        },
        "required": ["blackQuote"]
      }
  ],

  "required": [
    "colour"
  ]
}

これは次のように機能します。

  • 色が「赤」の場合は、「redQuote」(「blackQuote」ではない)が必要です。これで問題ありません。
  • 色が「黒」の場合は、「blackQuote」(「redQuote」ではない)が必要です。これも問題ありません。
  • しかし、JSONに「青」の色を入力すると、バリデーターは「redQuote」と「blackQuote」のプロパティが欠落していると言います...それは必要ありません。「red」と「black」の依存関係のみが必要です。 "ですが、色が"青 "の場合は何も必要ありません。これを達成する方法は?
7
wesleyy

これは、含意(!AまたはB)と呼ばれるブール論理の概念を使用して行うことができます。 「if-then」ステートメントのように使用できます。たとえば、「color」が「red」ではないか、「redQuote」が必要です。これを使用する必要があるときはいつでも、definitionsで分解して、可能な限りニースと表示されるようにします。

{
  "$schema": "http://json-schema.org/draft-04/schema#",
  "type": "object",
  "properties": {
    "colour": { "enum": ["red", "black", "blue"] },
    "blackQuote": { "type": "string", "maxLength": 11 },
    "redQuote": { "type": "string", "maxLength": 11 }
  },
  "allOf": [
    { "$ref": "#/definitions/red-requires-redQuote" },
    { "$ref": "#/definitions/black-requires-blackQuote" }
  ],
  "required": ["colour"],
  "definitions": {
    "red-requires-redQuote": {
      "anyOf": [
        { "not": { "$ref": "#/definitions/is-red" } },
        { "required": ["redQuote"] }
      ]
    },
    "black-requires-blackQuote": {
      "anyOf": [
        { "not": { "$ref": "#/definitions/is-black" } },
        { "required": ["blackQuote"] }
      ]
    },
    "is-red": {
      "properties": {
        "colour": { "enum": ["red"] }
      }
    },
    "is-black": {
      "properties": {
        "colour": { "enum": ["black"] }
      }
    }
  }
}
8

ドラフト-04の最も簡単な答え(コメントでGaneshが指摘したように):

{
  "definitions": {},
  "$schema": "http://json-schema.org/draft-04/schema#",
  "type": "object",
  "properties": {

    "colour": {
      "type": "string",
      "enum": ["red", "black", "blue"]
    },

    "blackQuote": {
      "type": "string",
      "maxLength": 11
    },

    "redQuote": {
      "type": "string",
      "maxLength": 11
    }
  },

  "oneOf": [
      {
        "properties": {
          "colour": {"enum": ["red"]}
        },
        "required": ["redQuote"]
      },
      {
        "properties": {
          "colour": {"enum": ["black"]}
        },
        "required": ["blackQuote"]
      },
      {
        "properties": {
          "colour": {"enum": ["blue"]}
        }
      }
  ],

  "required": [
    "colour"
  ]
}
3
Henry Andrews

必要なものの詳細をOneOfに移動すると、特に色の他の値が大量に発生する場合は、すべてを非常に単純に保つことができます。

enter image description here

{
    "$schema": "http://json-schema.org/draft-04/schema#",
    "type": "object",
    "oneOf": [
        {
            "type": "object",
            "properties": {
                "colour": {
                    "type": "string",
                    "enum": [
                        "red"
                    ]
                },
                "redQuote": {
                    "type": "string",
                    "maxLength": 11
                }
            },
            "required": [
                "redQuote"
            ]
        },
        {
            "type": "object",
            "properties": {
                "colour": {
                    "type": "string",
                    "enum": [
                        "black"
                    ]
                },
                "blackQuote": {
                    "type": "string",
                    "maxLength": 11
                }
            },
            "required": [
                "blackQuote"
            ]
        },
        {
            "type": "object",
            "properties": {
                "colour": {
                    "type": "string",
                    "enum": [
                        "blue"
                    ]
                }
            }
        }
    ],
    "definitions": {}
}
3
Sprotty