提问者:小点点

如何使用数组元素进行JSON模式多级条件验证


我正在处理一个JSON模式,我一直在进行数组验证。我有一个输入JSON的例子

{
  "paths_1": {
    "path_1": [
      {
        "abc": "valid_abc"
      },
      {
        "abc": "invalid_abc"
      }
    ]
  },
  "paths_2": {
    "path_2": [
      {
        "ghi": "valid_ghi"
      }
    ]
  }
}

我对这个JSON数据的规则是,如果paths_2.path_2[]. ghi是valid_ghi并且paths_1.path_1[]. abc是valid_abc,那么需要具有valid_abc的对象的def键。

我为这个规则创建了这个JSON模式,但是它不能像预期的那样工作。

{
  "$schema": "http://json-schema.org/draft-07/schema",
  "type": "object",
  "properties": {
    "paths_1": {
      "type": "object",
      "properties": {
        "items": {
          "properties": {
            "path_1": {
              "properties": {
                "abc": {
                  "type": "string"
                },
                "def": {
                  "type": "string"
                }
              }
            }
          }
        }
      }
    },
    "paths_2": {
      "type": "object",
      "properties": {
        "items": {
          "properties": {
            "path_2": {
              "properties": {
                "ghi": {
                  "type": "string"
                }
              }
            }
          }
        }
      }
    }
  },
  "allOf": [
    {
      "if": {
        "allOf": [
          {
            "properties": {
              "paths_1": {
                "properties": {
                  "path_1": {
                    "contains": {
                      "properties": {
                        "abc": {
                          "const": "valid_abc"
                        }
                      },
                      "required": [
                        "abc"
                      ]
                    }
                  }
                }
              }
            }
          },
          {
            "properties": {
              "paths_2": {
                "properties": {
                  "path_2": {
                    "contains": {
                      "properties": {
                        "ghi": {
                          "const": "valid_ghi"
                        }
                      },
                      "required": [
                        "ghi"
                      ]
                    }
                  }
                }
              }
            }
          }
        ]
      },
      "then": {
        "properties": {
          "paths_1": {
            "properties": {
              "path_1": {
                "items": {
                  "required": [
                    "def"
                  ]
                }
              }
            }
          }
        }
      }
    }
  ]
}

当我测试这个模式时,它返回“def”是带有“invalid_abc”的对象的必需属性,而它不应该。

我尝试更改JSON模式中项目的包含键,但在本例中,若部分变为false,并且验证器返回该输入是有效的。

有没有办法用给定的规则验证此输入?


共1个答案

匿名用户

您需要再次检查项目中的valid_abc

您的then子句没有上下文,我想这正是您所期望的。

           "items": {
              "if": {
                "properties": {
                  "abc": {
                    "const": "valid_abc"
                  }
                },
                "required": [
                  "abc"
                ]
              },
              "then": {
                "required": [
                  "def"
                ]
              }
            }

演示:https://jsonschema.dev/s/M3cvJ

因此,您可以简化条件检查,因为您不需要检查数组是否包含具有有效\u abc的对象。您可以删除if/allOf[0],然后展开allOf,因为它只有一个子模式。