Json 架构是否允许 属性 的定义引用另一个 属性?

Does Json Schema allow a property's definition to reference another property?

我想创建一个 JSON 架构,根据另一个 属性 的值限制一个 属性 的值。

一个有效对象示例可能如下所示:

{
   "lookup": {
      "foo": "string",
      "bar": "number",
   },
   // properties in `values` must exist in `lookup`
   "values": {
      // `foo` must be a string
      "foo": "string is OK",
      // `bar` must be a number
      "bar": 100
   }
}

这个想法是让架构强制两个属性之间的关系。

{
"type": "object",
"properties": {
  "lookup" : {
    "type": "object",
    "additionalProperties" : {
      "type": "string",
      "enum": ["string", "number"]
    }
  },
  "values": {
    "type": "object",
    // - this value's properties must exist in `lookup`
    // - if the property in `lookup` is set to `string`, the type here must be `string`; if the property in `lookup` is set to `number`, the type here must be `number`
  }
}
}

JSON 架构的标准规范不可能做到这一点。

在某些情况下这是可能的。虽然您不能将一段数据限制为从数据的其他部分获取的某些值(例如:使用 属性 X 来提供 属性 Y 可以具有的值列表),但您可以在架构的各个部分之间指定条件。

  • 要求 1:此值的属性必须存在于 lookup -> 不可能
  • 要求2:如果lookup中的属性设置为string,这里的类型必须是string;如果lookup中的属性设置为number,这里的类型必须是number -> possible

请参阅 https://json-schema.org/understanding-json-schema/reference/conditionals.html 了解可供您使用的各种选项。