【问题标题】:How to define an object with a veriable name in JSON Schema?如何在 JSON Schema 中定义具有变量名的对象?
【发布时间】:2019-02-26 19:40:44
【问题描述】:

我想为这个 JSON“伪代码”示例创建一个 JSON 模式:

{
    "xyz": {
        "$something": {
            "property_a": "...",
            "property_b": "...",
            "property_c": "..."
        }
    }
}

$something 可以是以下字符串之一:foobarbuz。我当前的架构如下所示:

{
  "xyz": {
    "id": "xyz",
    "type": "object",
    "properties": {
      "foo": {
        "id": "foo",
        "type": "object",
        "additionalProperties": false,
        "required": ["property_a"],
        "properties": {
          "property_a": {
            "id": "property_a",
            "type": "string"
          },
          "property_b": {
            "id": "property_b",
            "type": "string"
          },
          "property_c": {
            "id": "property_a",
            "type": "string"
          }
        }
      },
      "bar": {
        ... copy&paste foo
      },
      "buz": {
        ... copy&paste foo
      }
    }
  }
}

它可以工作,但它有很多重复的代码。所以我正在寻找一种更优雅的方式来实现它。

如何定义允许作为 JSON Schema 中属性名称的值列表(谎言enum)?

【问题讨论】:

  • 您查看过oneOf 以及参考资料吗?
  • 感谢您的评论! oneOfanyOf 等适用于“关键字的值”。我想要实现的是使 key 变量。
  • 这看起来像jsonapi。有一个很好的例子说明你可能会在这里尝试做什么:github.com/eneuhauser/json-api/blob/schema/schema。我使用该架构来验证我的所有资源,并使用引用来检查响应的形状。看起来它使用模式属性来定义变量值,除了已知值之一
  • 你看过patternProperties吗?它不是枚举,但您可以在正则表达式中列出。或者你还想要什么? =]
  • @Relequestual 是的,这实际上正是我想要的。谢谢!

标签: json enums jsonschema


【解决方案1】:

patternProperties 的作用类似于属性,只是对象的键是正则表达式。

https://datatracker.ietf.org/doc/html/draft-handrews-json-schema-validation-01#section-6.5.5

来自Understanding JSON Schema site的示例

{
  "type": "object",
  "patternProperties": {
    "^S_": { "type": "string" },
    "^I_": { "type": "integer" }
  },
  "additionalProperties": false
}

在此示例中,名称以 前缀 S_ 必须是字符串,任何带有前缀 I_ 的都必须是 整数。在 properties 关键字中明确定义的任何属性 也被接受,以及任何不匹配的附加属性 任何一个正则表达式都被禁止。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2015-11-22
    • 2019-12-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-12-17
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多