【问题标题】:JSON Schema with unknown property names具有未知属性名称的 JSON Schema
【发布时间】:2015-11-09 18:11:29
【问题描述】:

我想在对象数组中拥有一个属性名称未知的 JSON 模式。 一个很好的例子是网页的元数据:

      "meta": {
        "type": "array",
        "items": {
          "type": "object",
          "properties": {
            "unknown-attribute-1": {
              "type": "string"
            },
            "unknown-attribute-2": {
              "type": "string"
            },
            ...
          }
        }
      }

请问有什么想法,或者其他方法可以达到同样的效果吗?

【问题讨论】:

  • 请详细说明您想要达到的目标
  • 元数据是一个对象数组,我不知道对象属性的可能名称
  • 您希望对未命名的属性实施哪些约束?您希望他们有某种类型,还是希望他们的名字遵循某种模式?如果您没有 additionalProperties=false,您可以在 JSON 架构中拥有未知的属性名称
  • 是的,我想强制它们为“字符串”类型名称不必匹配任何模式
  • 看看at this answer,与下面的建议相比,实现这一目标的方法要简单得多。

标签: json jsonschema


【解决方案1】:

使用patternProperties 代替properties。在下面的示例中,模式匹配正则表达式 .* 接受任何属性名称,并且我仅通过使用 "additionalProperties": false 来允许 stringnull 的类型。

  "patternProperties": {
    "^.*$": {
      "anyOf": [
        {"type": "string"},
        {"type": "null"}
      ]
    }
  },
  "additionalProperties": false

...或者如果您只想在“对象”中允许一个字符串(就像在原始问题中一样):

  "patternProperties": {
    "^.*$": {
        {"type": "string"},
    }
  },
  "additionalProperties": false

【讨论】:

  • 我收到错误“不允许使用属性'patternProperties'”。
  • @AlexeySh。请发布您的完整 JSON,我会看看
  • 完全复制粘贴你的答案
  • @AlexeySh。我的第一个猜测是您使用的是 JSON Schema 还是 OpenAPI。如果是 JSON Schema,那么您应该使用最新版本。如果是 OpenAPI,谷歌搜索显示 patternProperties 在版本 3 中没有进入 OpenAPI。也许有更高版本。
  • 好像是因为我用的是swagger,不支持最新的架构
【解决方案2】:

您可以对未明确定义的属性进行约束。以下模式强制“元”为属性为字符串类型的对象数组:

{
    "properties" : {
        "meta" : {
            "type" : "array",
            "items" : {
                "type" : "object",
                "additionalProperties" : {
                    "type" : "string"
                }
            }
        }
    }
}

如果您只想拥有一个字符串数组,您可以使用以下架构:

{
    "properties" : {
        "meta" : {
            "type" : "array",
            "items" : {
                "type" : "string"
            }
        }
    }
}

【讨论】:

    【解决方案3】:

    @jruizaranguren 的解决方案对我有用。 虽然我和定义架构的人一样,但我选择了另一种解决方案

    "meta": {
            "type": "array",
            "items": {
              "type": "array",
              "items": {
                "type": "object",
                "properties": {
                  "name": {
                    "type": "string"
                  },
                  "value": {
                    "type": "string"
                  }
                }
              }
            }
          }
    

    我将对象转换为名称-值对象数组 一个有效的 JSON 示例:

    "meta": [
        [
          {
            "name": "http-equiv",
            "value": "Content-Type"
          },
          {
            "name": "content",
            "value": "text/html; charset=UTF-8"
          }
        ],
        [
          {
            "name": "name",
            "value": "author"
          },
          {
            "name": "content",
            "value": "Astrid Florence Cassing"
          }
        ]
      ]
    

    【讨论】:

      猜你喜欢
      • 2020-06-18
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-06-29
      • 1970-01-01
      • 1970-01-01
      • 2023-03-16
      相关资源
      最近更新 更多