【问题标题】:How would you design JSON Schema for an arbitrary key?您将如何为任意键设计 JSON Schema?
【发布时间】:2013-04-19 19:30:36
【问题描述】:

我有以下 JSON 输出数据:

{
   "label_name_0" : 0,
   "label_name_5" : 3,
   .
   .
   .
   "label_name_XXX" : 4
}

输出很简单:与整数值关联的键[1] 名称。如果键名没有改变,我可以很容易地想出类似这样的 JSON Schema:

    {
        "type": "array"
        "title": "Data output",
        "items" :{ 
            "properties": {
                "label_name": {
                   "type": "integer",
                   "default": 0,
                   "readonly": True,
            }
        }
    },

由于密钥名称本身是未知的并且不断变化,因此我必须为其设计架构。我唯一知道的是,密钥是string,并且不超过 100 个字符。如何为不断变化的键 lable_name_xxx 定义 JSON Schema。

[1] 不确定我是否使用了正确的术语

【问题讨论】:

  • 你应该接受@Konrad 的回答。

标签: json jsonschema


【解决方案1】:

在 json-schema.org 上,您会在 File System Example 部分找到合适的内容。您可以在object 中定义patternProperties。

{
    "type": "object",
    "properties": {
        "/": {}
    },
    "patternProperties": {
        "^(label_name_[0-9]+)+$": { "type": "integer" }
    },
    "additionalProperties": false,
 }

正则表达式(label_name_[0-9]+)+ 应该适合您的需要。在 JSON Schema 中,正则表达式显式地使用 ^ 和 $ 锚定。正则表达式定义必须至少有一个属性 (+)。该属性由label_name_ 和一个介于0 和9 之间的数字组成,而([0-9]+) 必须至少有一个数字,但也可以是任意多个。

通过将additionalProperties 设置为false,它会限制对象属性以匹配正则表达式。

【讨论】:

【解决方案2】:

正如 Konrad 的回答所说,使用patternProperties。但是用 properties 代替,这是不需要的,我认为 Konrad 只是从他的参考示例中粘贴的,该示例期望以/ 开头的路径。在下面的示例中,模式匹配 regex .* 接受任何属性名称,并且我只允许使用 "additionalProperties": false 的字符串或 null 类型。

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

【讨论】:

  • additionalProperties 对类型约束没用,它是由anyOf 声明的。
  • 如果属性名称不能为空,则模式应为^.+$。然后,"additionalProperties": false 也必须设置。
【解决方案3】:

比 patternProperties 更简单的解决方案,因为 OP 对键名没有任何要求 (documentation):

{
    "type": "object",
    "additionalProperties": {
        "type": "integer",
        "default": 0,
        "readonly": true,
    }        
}

default 和 readonly 包括在内,因为它们已包含在 OP 的初始建议中,但不是必需的。

【讨论】:

    猜你喜欢
    • 2021-12-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-12-18
    • 2020-05-17
    相关资源
    最近更新 更多