当前位置: 首页 > 知识库问答 >
问题:

基于属性的JSON模式验证

宓诚
2023-03-14

我一直在努力使我的JSON模式正确。我有一个Boolean属性,我必须根据它来确定所需的属性。下面是我的示例JSON,我希望通过验证,因为item3不存在。

{
  "item1": true,
  "item2": "ABC"
}

这是我希望通过验证的JSON

{
  "item1": true,
  "item2": "ABC",
  "item3": {
    "subItem1": "ABC",
    "subItem2": "BAC"
  }
}

类似地,如果Item1false,那么上述两个JSON的验证都应该通过。

{
    "definitions": {},
    "type": "object",
    "title": "The Root Schema",
    "properties": {
        "item1": {
            "$id": "#/properties/item1",
            "type": "boolean",
            "title": "The Item1 Schema",
            "default": false,
            "examples": [
                true
            ]
        },
        "item2": {
            "$id": "#/properties/item2",
            "type": "string",
            "title": "The Item2 Schema",
            "default": "",
            "examples": [
                "ABC"
            ],
            "pattern": "^(.*)$"
        },
        "item3": {
            "$id": "#/properties/item3",
            "type": "object",
            "title": "The Item3 Schema",
            "required": [
                "subItem1",
                "subItem2"
            ],
            "properties": {
                "subItem1": {
                    "$id": "#/properties/item3/properties/subItem1",
                    "type": "string",
                    "title": "The Subitem1 Schema",
                    "default": "",
                    "examples": [
                        "AAA"
                    ],
                    "pattern": "^(.*)$"
                },
                "subItem2": {
                    "$id": "#/properties/item3/properties/subItem2",
                    "type": "string",
                    "title": "The Subitem2 Schema",
                    "default": "",
                    "examples": [
                        "BAC"
                    ],
                    "pattern": "^(.*)$"
                }
            }
        }
    },
    "required": ["item1"],
    "allOf": [{
        "if": {
            "properties": {
                "item1": {
                    "enum": [
                        true
                    ]
                }
            }
        },
        "then": {
            "required": [
                "item2",
                "item3"
            ]
        },
        "else": {
            "required": [
                "item2"
            ]
        }
    }]
}

共有1个答案

狄心水
2023-03-14

您的if/then/else块在验证方面工作正常。

您提供的希望通过的示例JSON失败了,因为您要求item3具有subitem1subitem2的属性,但它没有。

现在,您已经更新了示例JSON,它应该传递给正确的item3,其中包含subitem1subitem2,验证通过您提供的模式进行。

另外,如果我理解正确的话,你想要:

如果item1为true,则需要subItem2。如果item1为false,则item3不是必需的,但如果包含item3,则仍应进行验证。

将使subitem3成为必需的架构从item3移动到then子句。这将使subitem3仅在Iff架构验证成功时才是“必需的”(item1true)

{
  "definitions": {},
  "type": "object",
  "title": "The Root Schema",
  "properties": {
    "item1": {
      "$id": "#/properties/item1",
      "type": "boolean",
      "title": "The Item1 Schema",
      "default": false,
      "examples": [
        true
      ]
    },
    "item2": {
      "$id": "#/properties/item2",
      "type": "string",
      "title": "The Item2 Schema",
      "default": "",
      "examples": [
        "ABC"
      ],
      "pattern": "^(.*)$"
    },
    "item3": {
      "$id": "#/properties/item3",
      "type": "object",
      "title": "The Item3 Schema",
      "required": [
        "subItem1"
      ],
      "properties": {
        "subItem1": {
          "$id": "#/properties/item3/properties/subItem1",
          "type": "string",
          "title": "The Subitem1 Schema",
          "default": "",
          "examples": [
            "AAA"
          ],
          "pattern": "^(.*)$"
        },
        "subItem2": {
          "$id": "#/properties/item3/properties/subItem2",
          "type": "string",
          "title": "The Subitem2 Schema",
          "default": "",
          "examples": [
            "BAC"
          ],
          "pattern": "^(.*)$"
        }
      }
    }
  },
  "required": [
    "item1"
  ],
  "allOf": [
    {
      "if": {
        "properties": {
          "item1": {
            "enum": [
              true
            ]
          }
        }
      },
      "then": {
        "required": [
          "item2",
          "item3"
        ],
        "properties": {
          "item3": {
            "required": [
              "subItem2"
            ]
          }
        }
      },
      "else": {
        "required": [
          "item2"
        ]
      }
    }
  ]
}
 类似资料:
  • 什么类型的价值适合于此?值应该只是布尔值(根据主模式),或者可以是布尔值或字符串(在正确的地方引用基资源)。我使用的JSON验证器不允许值为布尔值以外的任何值,我在JSON规范中搜索了很多,但没有关于它的信息。

  • 使用JSON Schema 7执行验证 是否可以使用json模式进行以下验证。 object 中的“prop” 属性是属性中的依赖值。 即只有“properties.name”存在,那么该值可以添加到“prop”数组中 注意: “属性”数组可以具有{name:}类型的任何对象 “name”可以有任何可能的字符串,我事先不知道 我一直在查阅文件,但能找到一个答案。 Json Schema中还不支持此

  • 在C#中是否有任何验证器可以使用,即使没有指令,也会使额外的属性失败?

  • 我有一个像这样的xml结构 我需要选择ClassX节点,并在包含constname1(即variable1)AttAttribute的值中 这起作用了。但是,我需要做如下操作,而不是在循环中混合文本 这是我不对的 然而下面是正确的 但我希望将选择范围限制为classX的节点

  • 问题内容: 例如,文件系统的架构,目录包含文件列表。该模式由文件规范,下一个子类型“ image”和另一个“ text”组成。 在底部是主目录架构。目录具有属性内容,该属性内容是应作为文件子类型的项目的数组。 基本上,我正在寻找一种告诉验证器从正在验证的json对象中的属性中查找“ $ ref”的值的方法。 示例json: “伪”模式 说明“图像”和“文本”定义包含在同一模式中,但它们可能在其他位

  • 我想使用模式验证JSON(目前草案6,但如果需要,我们可以升级)。我的案例是一个具有属性的对象,其值都具有相同的结构,例如: 是否有办法为一般属性值设置验证模式?类似的东西: 谢谢你。