【问题标题】:Python jsonschema unable to validate JSON schema conditional nested propertiesPython jsonschema 无法验证 JSON 模式条件嵌套属性
【发布时间】:2021-07-29 12:12:28
【问题描述】:

重新发布问题How to implement conditional nested properties with JSON Schema(标记为重复,尽管它是一个完全不同的问题) 我的 JSON 模式在下面尝试基于:JSON Schema if/then require nested object

{
  "$id": "myschema.json",
  "if":{
    "type":"object",
    "properties": {
      "common_data": {
        "type":"object",
        "properties":{
          "remote_os": {
              "type":"object",
              "required":["common_data"],
              "const": "Linux"
            }
          },
          "required":["remote_os"]
      }
    }
  },
  "then": {
    "type":"object",
    "properties": {
      "file": {
        "type": "string",
        "pattern": "^(.*.)(bin)$"
        }
      }
  },
  "else": {
    "type":"object",
    "properties": {
      "file": {
        "type": "string",
        "pattern": "^(.*.)(exe)$"
        }
      }
  }
}

基本上添加if-else 逻辑以确保remote_os=Linux file 应该以.binremote_os=Windows 结束,file 应该以.exe 结束 现在我正在尝试验证以下数据

{
  "common_data": {
    "remote_os": "Linux"
  },
  "file": "abc.bin"
}

收到错误:[<ValidationError: "'abc.bin' does not match '^(.*.)(exe)$'">]

当尝试调试 python jsonschema 正在尝试在此架构之上构建哪些属性以验证我的数据时。明白了

properties {'common_data': {'type': 'object', 'properties': {'remote_os': {'type': 'object', 'required': ['common_data'], 'const': 'Linux'}}, 'required': ['remote_os']}}
properties {'remote_os': {'type': 'object', 'required': ['common_data'], 'const': 'Linux'}}
properties {'file': {'type': 'string', 'pattern': '^(.*.)(exe)$'}}

所以它总是与'pattern': '^(.*.)(exe)$' 匹配,而与remote_os 无关。寻找一些指导,如何解决这个问题。

【问题讨论】:

  • 我将其标记为重复,因为这方面是最明显的问题,但是现在您已经纠正了这个问题,我可以看到其他一些问题,我很高兴为您提供解决方案!跨度>
  • @Relequestual 非常感谢。是的,我花了一些时间并试图通过几篇文章和类似的问题来纠正这个问题。但仍然无法使其工作。非常感谢您的帮助。

标签: jsonschema json-schema-validator python-jsonschema


【解决方案1】:

你已经接近了,但有一些问题。

首先,让我们评估一下我们的假设是否正确...看起来if 失败了,并触发了else 架构值而不是then 架构值。我们可以通过将if 更改为简单的true 来检查这一点。

是的,then 子模式在应用时可以正常工作。

好的,让我们删除嵌套模式的一部分,直到它按预期工作......

啊……看。 remote_os 在我们的数据中是一个字符串,但它已在模式中定义为一个对象。删除type: object

那些required 关键字与数据位置不匹配...只需将它们向上移动到正确的级别...

我们最终得到了这个架构: (现场演示:https://jsonschema.dev/s/CEwMw

{
  "$schema": "http://json-schema.org/draft-07/schema",
  "$id": "myschema.json",
  "if": {
    "type": "object",
    "required": [
      "common_data"
    ],
    "properties": {
      "common_data": {
        "type": "object",
        "required": [
          "remote_os"
        ],
        "properties": {
          "remote_os": {
            "const": "Linux"
          }
        }
      }
    }
  },
  "then": {
    "type": "object",
    "properties": {
      "file": {
        "type": "string",
        "pattern": "^(.*.)(bin)$"
      }
    }
  },
  "else": {
    "type": "object",
    "properties": {
      "file": {
        "type": "string",
        "pattern": "^(.*.)(exe)$"
      }
    }
  }
}

此外,另一个架构调试技巧是取出 if 架构值,并将其用作整个架构。这样您就可以找出验证失败的原因,而不仅仅是猜测。

这些都是容易犯的错误!我在尝试修复它时做了一些。重要的是要知道如何调试您的架构。测试假设,并识别子模式。

【讨论】:

  • Relequestual,您解释的方式非常感谢。我向您学习了我们需要调试模式的方式。谢谢你。
  • 非常欢迎!如果您发现 StackOverflow 不适合的问题,请随时加入 JSON Schema 松弛服务器。我们也从这里监控标签 =]
  • 实际上,我正在尝试为我使用 local JSON schema definition file$ref 的实际 JSON 模式实现相同的功能。我的$ref 文件看起来像:jsonschema.dev/s/RG9d8 和相同的架构(你提示)我在这里填充了jsonschema.dev/s/8d2KN。虽然后来工作正常,但通过$ref 添加架构再次出现问题。在我的调试中缺少任何东西
  • 我建议您发布另一个问题,其中包含足够的信息来复制问题。您可以使用json-schema.hyperjump.io 测试多文档模式。 $ref 的工作原理通常是人们必须学习的东西。它与文件系统上的文件无关。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-03-28
相关资源
最近更新 更多