您如何为任意键设计JSON Schema?

时间:2013-04-25 18:58:28

标签: json jsonschema

我有以下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模式。

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

2 个答案:

答案 0 :(得分:30)

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

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

正则表达式(label_name_[0-9]+)+应该符合您的需求。在JSON Schema中,正则表达式使用^$显式锚定。正则表达式定义必须至少有一个属性(+)。该属性由label_name_09之间的数字组成,但必须至少有一个数字([0-9]+),但也可以有任意数量。{/ p>

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

答案 1 :(得分:12)

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

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