需要基于嵌套字段值的json模式字段

时间:2016-12-22 14:58:27

标签: json jsonschema

我已经尝试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"

1 个答案:

答案 0 :(得分:1)

除非您希望数据中的值是必需属性名称的一部分(使用JSON模式关键字是不可能的),否则您可以执行此关联:

{
  "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"
            }
          }
        }
      }
    }
  ]
}