我如何根据 JSON 模式中另一个 属性 值的存在来验证一个 属性 值的存在依赖性

How can I validate the dependency of existance of value for one property value based on the existance of another property value in JSON schema

我有一个 JSON 模式:

{
  "type": "object",
  "properties": {
"name": { "type": ["string", "null"] },
"credit_card": { 
     "type": ["string", "null"]
},
"billing_address": {
     "type": ["string", "null"]
}
},

"dependencies": [{
"credit_card": ["billing_address"]
}]

}

如果提供 credit_card 值,我希望存在 billing_address 值。但是,由于我已将 billing_address 的类型指定为 null,因此即使存在 credit_card 值,它也接受 null 值,因此不进行验证。有人可以建议这样做的正确方法。 提前致谢。

您的 dependencies 应该定义为对象 {} 而不是数组 []。您只需要删除外部方括号:

"dependencies": {
  "credit_card": ["billing_address"]
}

总的来说,这给出了以下架构:

{
    "type": "object",
    "properties": {
        "name": {
            "type": ["string", "null"]
        },
        "credit_card": {
            "type": ["string", "null"]
        },
        "billing_address": {
            "type": ["string", "null"]
        }
    },
    "dependencies": {
        "credit_card": ["billing_address"]
    }
}

使用上面的架构,下面的JSON是有效的:

{
  "name": "Abel",
  "credit_card": "1234...",
  "billing_address": "some address here..."
}

但是下面的JSON是无效的:

{
  "name": "Abel",
  "credit_card": "1234"
}

您可以使用 this one.

等在线验证器来测试这些

您可能还需要考虑删除架构中使用的 null 值。例如,通过使用此:

{
    "type": "object",
    "properties": {
        "name": {
            "type": "string",
        },
        "credit_card": {
            "type": "string",
        },
        "billing_address": {
            "type": "string",
        }
    },
    "dependencies": {
        "credit_card": ["billing_address"]
    }
}

使用这个修改后的架构,您现在还会收到 JSON 的验证错误,例如:

{
  "name": "Abel",
  "credit_card": null,
  "billing_address": "some address here..."
}

Update - 两个字段都存在但为空:

如果 credit_cardbilling_address 都为空,则可以使用条件验证来处理这种情况(添加到下面模式的末尾):

{
    "type": "object",
    "properties": {
        "name": {
            "type": ["string", "null"]
        },
        "credit_card": {
            "type": ["string", "null"]
        },
        "billing_address": {
            "type": ["string", "null"]
        }
    },
    "dependencies": {
        "credit_card": ["billing_address"]
    },
    "if": {
      "properties": { "credit_card": { "const": null } }
    },
    "then": {
      "properties": { "billing_address": { "const": null } }
    }
}

现在,以下内容也将有效:

{
  "name": "Abel",
  "credit_card": null,
  "billing_address": null
}

一个警告说明:这使用了 JSON 架构规范的一个相对较新的功能。我在上面提到的在线验证器支持它 - 但我不知道它是否被您可能使用的任何验证器支持。