json 根据嵌套字段的值需要架构字段

json schema field required based on value of nested field

我试过JSON Schema - specify field is required based on value of another field,但在以下情况下它对我不起作用。

实例 1

{

   "part1": {
      "subPartA" : {
          "value": "X"
       }   
    },
    "partX": {
         "propXX": "val1",
         "prop2": null

     }
}

实例 2

{

   "part1": {
      "subPartA" : {
          "value": "Y"
       }   
    },
    "partY": {
         "propYY": "val123",
         "prop2": null

     }
}

如何制作 partX.propXX 如果 part1.subPart1.value = "X" 则需要 和 partY.propYY 如果 part1.subPart1.value = "Y"

则需要

?

除非你的意思是你希望数据中的值成为必需的 属性 名称的一部分(使用 JSON-schema 关键字是不可能的),你可以做这个关联:

{
  "type": "object",
  "required": ["part1"],
  "properties": {
    "part1": {
      "type": "object",
      "required": ["subPartA"],
      "properties": {
        "subPartA": {
          "type": "object",
          "required": ["value"],
          "properties": {
            "value": {
              "type": "string"
            }
          }
        }
      }
    }
  },
  "anyOf": [
    {
      "required": ["partX"],
      "properties": {
        "part1": {
          "properties": {
            "subPartA": {
              "properties": {
                "value": {
                  "enum": ["X"]
                }
              }
            }
          }
        },
        "partX": {
          "type": "object",
          "required": ["propXX"],
          "properties": {
            "propXX": {
              "type": "string"
            }
          }
        }
      }
    },
    {
      "required": ["partY"],
      "properties": {
        "part1": {
          "properties": {
            "subPartA": {
              "properties": {
                "value": {
                  "enum": ["Y"]
                }
              }
            }
          }
        },
        "partY": {
          "type": "object",
          "required": ["propYY"],
          "properties": {
            "propYY": {
              "type": "string"
            }
          }
        }
      }
    }
  ]
}