为什么json对象对这个条件模式有效?

eyh26e7m  于 2023-01-06  发布在  其他
关注(0)|答案(1)|浏览(112)

下面是json对象。

{
  "payment": {
    "account": [
      {
        "type": "ACCOUNT_INFORMATION",
        "identification": "2451114"
      },
      {
        "type": "XXX",
        "identification": "2451114"
      }
    ]

  }
}

这是一个模式。

{
  "if": {
    "properties": {
      "payment": {
        "properties": {
          "account": {
            "items": {
              "properties": {
                "type": {
                  "const": "ACCOUNT_INFORMATION"
                }
              }
            }
          }
        }
      }
    }
  },
  "then": {
    "properties": {
      "payment": {
        "properties": {
          "account": {
            "items": {
              "properties": {
                "identification": {
                  "maxLength": 8,
                  "minLength": 8
                }
              }
            }
          }
        }
      }
    }
  }
}

如果如下删除第二个核算项目,则方案出错。

{
  "payment": {
    "account": [
      {
        "type": "ACCOUNT_INFORMATION",
        "identification": "2451114"
      }
    ]
  }
}

这是因为条件模式不能应用于嵌入式数组吗?
确认使用https://www.jsonschemavalidator.net/
第一个json对象不返回错误,而第二个对象返回违反minLength约束的错误。
两者都应该返回错误吗?

f87krz0w

f87krz0w1#

为了了解发生了什么,让我们分解模式,重点关注if模式的关键部分。

"items": {
  "properties": {
    "type": { "const": "ACCOUNT_INFORMATION" }
  }
}

给定此架构,以下示例无效,因为并非所有“type”属性都具有值“ACCOUNT_INFORMATION”。

[
  {
    "type": "ACCOUNT_INFORMATION",
    "identification": "2451114"
  },
  {
    "type": "XXX",
    "identification": "2451114"
  }
]

而且,下面的值是有效的,因为所有“类型”属性都具有值“ACCOUNT_INFORMATION”。

[
  {
    "type": "ACCOUNT_INFORMATION",
    "identification": "2451114"
  }
]

验证结果的差异就是这两个值在方案中表现不同的原因。仅当if方案的计算结果为true时才应用then方案,这是第二个示例的结果,而第一个示例没有。then方案应用于第二个示例,minLength约束条件导致验证失败。
看起来您的条件只适用于items模式,因此您可以通过将条件只移动到该对象中来解决这个问题。

{
  "properties": {
    "payment": {
      "properties": {
        "account": {
          "items": {
            "if": {
              "properties": {
                "type": {
                  "const": "ACCOUNT_INFORMATION"
                }
              },
              "required": ["type"]
            },
            "then": {
              "properties": {
                "identification": {
                  "maxLength": 8,
                  "minLength": 8
                }
              }
            }
          }
        }
      }
    }
  }
}

相关问题