您将如何为任意键设计 JSON Schema?
Posted
技术标签:
【中文标题】您将如何为任意键设计 JSON Schema?【英文标题】:How would you design JSON Schema for an arbitrary key? 【发布时间】: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 的回答。 【参考方案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
,它会限制对象属性以匹配正则表达式。
【讨论】:
死链接。文档位于json-schema.org/understanding-json-schema/reference/…【参考方案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 的初始建议中,但不是必需的。
【讨论】:
以上是关于您将如何为任意键设计 JSON Schema?的主要内容,如果未能解决你的问题,请参考以下文章
[iPhone]你将如何为下面给出的结构设计核心数据对象模型