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

Cor*_*ory 29 json jsonschema

我有以下JSON输出数据:

{
   "label_name_0" : 0,
   "label_name_5" : 3,
   .
   .
   .
   "label_name_XXX" : 4
}
Run Code Online (Sandbox Code Playgroud)

输出很简单:与整数值关联的键[1]名称.如果密钥名称没有改变,我可以轻松地提出类似于这样的JSON Schema:

    {
        "type": "array"
        "title": "Data output",
        "items" :{ 
            "properties": {
                "label_name": {
                   "type": "integer",
                   "default": 0,
                   "readonly": True,
            }
        }
    },
Run Code Online (Sandbox Code Playgroud)

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

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

Kon*_*che 34

在json-schema.org上,您可以在" 高级示例"部分找到适合的内容.你可以patternProperties在里面定义一个object.

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

正则表达式(label_name_[0-9]+)+应该符合您的需求.在JSON Schema中,正则表达式使用^和显式锚定$.正则表达式定义,必须至少有一个property(+).该物业包括label_name_之间的一个数字09,而必须有至少一个数字([0-9]+),但也可以任意很多.

通过设置additionalPropertiesfalse约束对象属性以匹配正则表达式.

  • 死链接。文档位于 https://json-schema.org/understanding-json-schema/reference/object.html#pattern-properties (4认同)

pin*_*man 16

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

  "patternProperties": {
    "^.*$": {
      "anyOf": [
        {"type": "string"},
        {"type": "null"}
      ]
    }
  },
  "additionalProperties": false
Run Code Online (Sandbox Code Playgroud)


mrt*_*rsn 15

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

{
    "type": "object",
    "additionalProperties": {
        "type": "integer",
        "default": 0,
        "readonly": true,
    }        
}
Run Code Online (Sandbox Code Playgroud)

defaultreadonly包含在内,因为它们已包含在OP的最初建议中,但它们不是必需的。

  • 谢谢。这正是我在搜索与OP相同的问题时所寻找的。您的解决方案是最简单的解决方案,因为不需要正则表达式或键名限制。这应该是公认的答案。 (3认同)