Json 外部字段的模式依赖

Json Schema dependency on outer field

给定一个 json 这样的结构

{
 "name": "John Doe",
 "billing_address": "123 main st",
 "payment_details":{"credit_card": 55555555}
}

如果 payment_details.credit_card 存在,我需要将 'billing_address' 设为必填字段。

我从这个实现的示例开始,如果两个字段都处于同一嵌套级别

{
  "type": "object",

  "properties": {
    "name": { "type": "string" },
    "credit_card": { "type": "number" }
  },

  "required": ["name"],

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

但是,要求该字段比依赖字段高一级的语法是什么?

这对于 'dependencies' 来说太复杂了,所以我们回到 if/then/else 子句。我们将这些关键字放在顶层,也就是必填字段所在的位置。在伪代码中:“如果存在 payment_details 属性,并且它有 credit_card 属性,则需要 billing_address。”

{
  ...,
  "if": {
    "type": "object",
    "required": [ "payment_details" ],
    "properties": {
      "payment_details": {
        "type": "object",
        "required": [ "credit_card" ]
      }
    },
  "then": {
    "type": "object",
    "required": [ "billing_address" ]
  }
}

请注意,此处需要“type”和“required”关键字——因为不同类型的数据(例如数组)会导致特定于对象的关键字(如“properties”和“required”)的计算结果始终为是的。

感谢 Ether!这有效,但仅在 if 部分将信用卡添加为 属性 之后。 完整的 if 语句如下所示

"if": {
       "type": "object",
  "required": ["payment_details"],      
       "properties": {
              "payment_details": {
            "type": "object",
            "properties": {
                "credit_card": {}
            },
                        "required": ["credit_card"]
        }}},

完整的 json 架构如下所示

{
    "$schema": "http://json-schema.org/draft-07/schema#", 
    "type": "object",
    "properties": {
        "name": {
            "type": "string"
        },
        "billing_address": {
            "type": "string"
        },
        "payment_details": {
            "type": "object",
            "properties": {
                "credit_card": {
                    "type": "integer"
                }
            }
        }
    }
,    
"if": {
       "type": "object",
  "required": ["payment_details"],      
       "properties": {
              "payment_details": {
            "type": "object",
            "properties": {
                "credit_card": {}
            },
                        "required": ["credit_card"]
        }}},
  "then": {
    "type": "object",
    "required": [ "billing_address" ]
  }
}