具有未知属性名称的 JSON Schema
Posted
技术标签:
【中文标题】具有未知属性名称的 JSON Schema【英文标题】:JSON Schema with unknown property names 【发布时间】: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,与下面的建议相比,实现这一目标的方法要简单得多。 【参考方案1】:使用patternProperties
代替properties
。在下面的示例中,模式匹配正则表达式 .*
接受任何属性名称,并且我仅通过使用 "additionalProperties": false
来允许 string
或 null
的类型。
"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"
]
]
【讨论】:
以上是关于具有未知属性名称的 JSON Schema的主要内容,如果未能解决你的问题,请参考以下文章
SpringBoot - Flyway - JPA 集成 - 创建名称为“flywayInitializer”的 bean 时出错 - information_schema 中的未知表“事件”
将具有无效字符的嵌套字段从 Spark 2 导出到 Parquet [重复]