【问题标题】:Json Schema dependency on outer fieldJson Schema对外部字段的依赖
【发布时间】:2021-07-20 17:38:07
【问题描述】:

给定一个像这样的 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"]
    }
  }
}

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

【问题讨论】:

    标签: jsonschema


    【解决方案1】:

    这对于“依赖”来说太复杂了,所以我们回到 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”)始终评估为真。

    【讨论】:

    【解决方案2】:

    感谢以太!这有效,但只有在将信用卡添加为属性之后,在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" ]
      }
    }
    

    【讨论】:

    • "properties": { "credit_card": {} }, 仅表示“如果此属性存在,则为真”,这与根本没有它相同。如果有它与没有它的行为有所不同,这听起来像是你的评估者的一个错误。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2017-11-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-12-05
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多