Json 模式验证不适用于多个 if else 条件

问题描述 投票:0回答:1

嗨,我很确定我的 json 模式做错了,我的用例是我使用文档向表中添加一些元素,在这种情况下,元素是通过名称、值键对添加的。现在,如果 name 的值为“name”,那么它的值对应该遵循正则表达式验证,除了 1 个特定场景,如果添加这些的 tableName 是标头,在这种情况下它不应该遵循此正则表达式模式。

我的架构是->

{
    "properties": {
        "elements": {
            "type": "array",
            "items": {
                "$ref": "#arrayElement"
            },
            "minItems": 1
        }
    },
"definitions": {
        "arrayElement": {
            "$id": "#arrayElement",
            "type": "object",
            "required": ["tableName"],
            "properties": {
                "tableName": {
                    "type": "string"
                },
                "elms": {
                    "type": "array",
                    "items": {
                        "type": "object",
                        "required": ["name", "value"],
                        "properties": {
                            "name": {
                                "type": "string"
                            },
                            "value": {
                                "anyOf": [
                                    {
                                        "type": "string"
                                    },
                                    {
                                        "type": "number"
                                    },
                                    {
                                        "type": "boolean"
                                    }
                                ]
                            }
                        }
                    },
                    "minItems": 0
                },
                "ele2": {
                    "type": "object",
                    "$ref": "#objectElement"
                },
                "ele3": {
                    "type": "array",
                    "items": {
                        "$ref": "#arrayElement"
                    },
                    "minItems": 0
                }
            },
            "allOf": [
                {
                    "if": {
                        "properties": {
                            "elms": {
                                "items": {
                                    "properties": {
                                        "name": {
                                            "const": "name"
                                        }
                                    }
                                }
                            }
                        }
                    },
                    "then": {
                        "allOf": [
                            {
                                "if": {
                                    "properties": {
                                        "tableName": {
                                            "const": "header"
                                        }
                                    }
                                },
                                "then": {
                                    "properties": {
                                        "elms": {
                                            "items": {
                                                "properties": {
                                                    "value": {
                                                        "type": "string"
                                                    }
                                                }
                                            }
                                        }
                                    }
                                },
                                "else": {
                                    "properties": {
                                        "elms": {
                                            "items": {
                                                "properties": {
                                                    "value": {
                                                        "type": "string",
                                                        "pattern": "^[A-Za-z][A-Za-z0-9_.#/-]*$"
                                                    }
                                                }
                                            }
                                        }
                                    }
                                }
                            }
                        ]
                    },
                    "else": {
                        "properties": {
                            "elms": {
                                "items": {
                                    "properties": {
                                        "value": {
                                            "anyOf": [
                                                {
                                                    "type": "string"
                                                },
                                                {
                                                    "type": "number"
                                                },
                                                {
                                                    "type": "boolean"
                                                }
                                            ]
                                        }
                                    }
                                }
                            }
                        }
                    }
                }
            ]
        }
    }
}

现在这个有效负载正在通过,由于名称的正则表达式验证,它应该会失败

"elements": [
        {
            "tableName": "row",
            "elms": [
                {
                    "name": "name",
                    "value": "__________________________"
                },
                {
                    "name": "format",
                    "value": "string"
                },
                {
                    "name": "length",
                    "value": 15
                },
                {
                    "name": "active",
                    "value": true
                }
            ]
        }
    ]

提前致谢。

编辑:为了进行更多调试,我一起删除了 tableName 上的条件,只是为了看看 name 上的基本条件是否有效,似乎它本身不起作用。难道是我表示properties.elms.items.properties.name的方式不正确?

{
  "properties": {
    "elements": {
      "type": "array",
      "items": {
        "$ref": "#arrayElement"
      },
      "minItems": 1
    }
  },
  "definitions": {
    "arrayElement": {
      "$id": "#arrayElement",
      "type": "object",
      "required": ["tableName"],
      "properties": {
        "tableName": {
          "type": "string"
        },
        "elms": {
          "type": "array",
          "items": {
            "type": "object",
            "required": ["name", "value"],
            "properties": {
              "name": {
                "type": "string"
              },
              "value": {
                "anyOf": [
                  {
                    "type": "string"
                  },
                  {
                    "type": "number"
                  },
                  {
                    "type": "boolean"
                  }
                ]
              }
            }
          },
          "minItems": 0
        },
        "ele2": {
          "type": "object",
          "$ref": "#objectElement"
        },
        "ele3": {
          "type": "array",
          "items": {
            "$ref": "#arrayElement"
          },
          "minItems": 0
        }
      },
      "allOf": [
        {
          "if": {
            "properties": {
              "elms": {
                "items": {
                  "properties": {
                    "name": {
                      "const": "name"
                    }
                  }
                }
              }
            }
          },
          "then": {
            "properties": {
              "elms": {
                "items": {
                  "properties": {
                    "value": {
                      "type": "string",
                      "pattern": "^[A-Za-z][A-Za-z0-9_.#/-]*$"
                    }
                  }
                }
              }
            }
          },
          "else": {
            "properties": {
              "elms": {
                "items": {
                  "properties": {
                    "value": {
                      "anyOf": [
                        {
                          "type": "string"
                        },
                        {
                          "type": "number"
                        },
                        {
                          "type": "boolean"
                        }
                      ]
                    }
                  }
                }
              }
            }
          }
        }
      ]
    }
  }
}
json validation jsonschema ajv
1个回答
0
投票

您的条件比需要的复杂得多。

现在,如果 name 的值为“name”,那么它的值对应该遵循正则表达式验证,除了 1 个特定场景,如果添加这些的 tableName 是 header,在这种情况下它不应该遵循此正则表达式模式。

您可以将此条件表示为单个模式。

{
  "type": "object",
  "properties": {
    "tableName": {
      "not": { "const": "header" }
    },
    "elms": {
      "type": "array",
      "items": {
        "type": "object",
        "properties": {
          "name": { "const": "name" }
        },
        "required": ["name"]
      }
    }
  },
  "required": ["tableName", "elms"]
}

这就是您的

if
模式。您的
then
模式是正确的。你不需要
else
。无需嵌套。

最新问题
© www.soinside.com 2019 - 2025. All rights reserved.