有没有一种方法可以让一个对象中的规则引用另一个对象的属性?

Is there a way to have a rule in one object that references properties from a different object?

我找不到这方面的任何例子,所以我假设这是不可能的,但想确认一下。

我有一个引用其他模式的主模式: https://www.jsonschemavalidator.net/s/4aLvXa4I

{
  "$defs": {
    "mainSchema": {
      "$id": "https://example.com/person.schema.json",
      "$schema": "https://json-schema.org/draft/2020-12/schema",
      "additionalProperties": false,
      "type": "object",
      "properties": {
        "objectOne": {
          "$ref": "#/$defs/objectOne"
        },
        "objectTwo": {
          "$ref": "#/$defs/objectTwo"
        }
      }
    },
    "objectOne": {
      "type": "object",
      "properties": {
        "checkThisValue": {
          "type": "string",
          "enum": [
            "one",
            "two",
            "three"
          ]
        }
      }
    },
    "objectTwo": {
      "type": "object",
      "properties": {
        "whenSettingThisValue": {
          "type": "string",
          "enum": [
            "A",
            "B",
            "C"
          ]
        }
      }
    }
  },
  "$ref": "#/$defs/mainSchema"
}

我要定义这条规则:

IF objectOne.checkThisValue == one 
THEN objectTwo.whenSettingThisValue MUST == A
Same for two=>B and three=>C

这有可能吗?如何在 objectTwo 中引用 objectOne 属性?

编辑

我试图为此处引用 objectOne 的 objectTwo 创建一个 if 规则,但我的语法是错误的,因为它不起作用。 whenSettingThisValue 设置为 C 并且在应该无效时表示有效:https://www.jsonschemavalidator.net/s/NNjEIhWW

    "objectTwo": {
      "type": "object",
      "properties": {
        "whenSettingThisValue": {
          "type": "string",
          "enum": [
            "A",
            "B",
            "C"
          ]
        }
      },
      "if": {
        "properties": {
          "objectOne": {
            "checkThisValue": {
              "const": "one"
            }
          }
        }
      },
      "then": {
        "properties": {
          "objectTwo": {
            "whenSettingThisValue": {
              "const": "A"
            }
          }
        }
      }
    }
  },

我还尝试在 mainSchema 中使用 oneOf 规则,其中使用了两个子模式,但它也不起作用(此示例应该无效):https://www.jsonschemavalidator.net/s/WkmMasDC

"mainSchema": {
  "$id": "https://example.com/person.schema.json",
  "$schema": "https://json-schema.org/draft/2020-12/schema",
  "additionalProperties": false,
  "type": "object",
  "properties": {
    "objectOne": {
      "$ref": "#/$defs/objectOne"
    },
    "objectTwo": {
      "$ref": "#/$defs/objectTwo"
    }
  },
  "oneOf": [
    {
      "type": "object",
      "properties": {
        "objectOne": {
          "checkThisValue": {
            "const": "one"
          }
        },
        "objectTwo": {
          "whenSettingThisValue": {
            "const": "A"
          }
        }
      }
    }
  ]
},

解决方案

根据回答,我的 OneOf 规则格式错误。这正确地检查了一个对象中的值是为响应另一个对象而设置的。我想因为我在另一个模式中引用它们 $ref 我必须做一些特别的事情,但我没有。

https://www.jsonschemavalidator.net/s/HcVhrShk

  "oneOf": [
    {
      "type": "object",
      "properties": {
        "objectOne": {
          "properties": {
            "checkThisValue": {
              "const": "one"
            }
          }
        },
        "objectTwo": {
          "properties": {
            "whenSettingThisValue": {
              "const": "A"
            }
          }
        }
      }
    },
    {
      "type": "object",
      "properties": {
        "objectOne": {
          "properties": {
            "checkThisValue": {
              "const": "two"
            }
          }
        },
        "objectTwo": {
          "properties": {
            "whenSettingThisValue": {
              "const": "B"
            }
          }
        }
      }
    }
  ]
},

是的,你可以。有一个 if/then/else 构造将模式作为其参数,因此您可以定义规则“如果 属性 A 存在且值为 X,则 属性 B 必须存在且值为 Y" 等

这里有一些例子: https://json-schema.org/understanding-json-schema/reference/conditionals.html#if-then-else

编辑: 在重新编辑中,将 oneOf 子句更改为:

  "oneOf": [
    {
      "type": "object",
      "properties": {
        "objectOne": {
          "properties": {
            "checkThisValue": {
              "const": "one"
            }
          }
        }
      }
    },
    {
      "type": "object",
      "properties": {
        "objectTwo": {
          "properties": {
            "whenSettingThisValue": {
              "const": "A"
            }
          }
        }
      }
    }
  ]