确保数组中的项目属性在 Json Schema 中是唯一的?
Posted
技术标签:
【中文标题】确保数组中的项目属性在 Json Schema 中是唯一的?【英文标题】:Make sure item property in array is unique in Json Schema? 【发布时间】:2014-09-05 23:26:19 【问题描述】:鉴于以下 JSON 模式,是否可以指示“名称”属性应是唯一的(即“元素”数组中不应有两个具有相同“名称”的项目。
"root":
"type": "object",
"properties":
"elements":
"type": "array",
"minItems": 1,
"items":
"type": "object",
"properties":
"name":
"type": "string",
"title": "Element Name",
"minLength": 3,
,
"url":
"type": "string",
"title": "Some URL"
我尝试使用 uniqueItems 关键字,但它似乎是为简单的值列表设计的。
【问题讨论】:
我猜是通过指定"uniqueItems": true
。之前从未使用过 json-schema.org/example1.html 编辑:ietf 定义:tools.ietf.org/html/…
问题是 5.3.4.2。成功验证的条件说:“如果它的所有元素都是唯一的,则实例验证成功。”。但是如何定义元素是否唯一?
另外,您可能对github.com/json-schema-org/json-schema-spec/issues/538感兴趣
【参考方案1】:
不,这是不可能的。来自文档,json-schema:...一种基于 JSON 的格式,用于定义 JSON 数据的结构。
进行数据值验证非常有限,因为它不是标准的目的。很多人之前都问过这个问题,因为请求一种“唯一 ID”功能是很常见的。不幸的是,对于那些需要它的人,json-schema 并没有为您提供。
因此,如果您想确保唯一性,您唯一的选择是将“名称”作为属性键而不是属性值。
【讨论】:
谢谢。事实上,这对于当前的 JSON Schema 标准是不可能的。讨论是否应将此功能包含在标准的未来版本之一中:groups.google.com/forum/?hl=en#!topic/json-schema/CYd8xk1Czyg 现在好像可以了,参考文档:spacetelescope.github.io/understanding-json-schema/reference/… @dude,这仍然是不可能的。问题是要求强制执行属性值的唯一性。您链接的数组的唯一性在标准的早期版本中可用。【参考方案2】:如果重构数据结构是一种选择,以下方法可能会有所帮助:
用地图替换数组。这可以通过使用带有patternProperties
的对象轻松实现。该模式是一个正则表达式。任何与模式匹配的对象都将根据模式属性的模式进行验证。匹配任何字符串 >= 3 个字符的模式如下所示:"....*"
,但似乎总是隐含尾随 ".*"
,因此 "..."
也可以。
添加 additionalProperties:false 是强制执行约束的额外步骤 (minLength:3
)。
要强制映射中的至少一个元素(您的数组使用minItems:1
),请将minItems
替换为minProperties
。
...导致以下架构:
"root":
"type": "object",
"properties":
"elements":
"type": "object",
"patternProperties":
"...":
"type": "object",
"properties":
"url":
"type": "string"
,
"additionalProperties": false,
"minProperties": 1
如果类似以下(摘录)的文档与您的旧架构相匹配,
"elements": [
"name": "abc",
"url": "http://myurl1"
,
"name": "def",
"url": "http://myurl2"
,
"name": "ghij",
"url": "http://myurlx"
]
...这样的文档(摘录)将匹配新架构:
"elements":
"abc":
"url": "http://myurl1"
,
"def":
"url": "http://myurl2"
,
"ghij":
"url": "http://myurlx"
【讨论】:
但这并不能检查对象内的元素是否真的是唯一的 好吧,不幸的是 JSON 规范建议但不强制键的唯一性 (tools.ietf.org/html/rfc7159#section-4)。尽管如此,一些解析器确实会强制执行唯一性。 @yaccob 这是 JSON-Schema 强制执行 JSON 无法强制执行的事情的重点 @citizenconn 我明白你在说什么,但对我来说,你为什么这么说并不明显。你能解释一下吗? @yaccob 老实说,我不记得了,我失去了上下文,对不起!【参考方案3】:如果您的用例可以处理增加的开销,您可以对文档应用转换以生成精简文档,然后在精简文档上使用单独的迷你模式再次应用验证。
以下是一些关于 Json 转换工具信息的链接:
JSONata. A SO thread on Json transformation.在 JSONata 中处理您的示例案例非常简单。
【讨论】:
【参考方案4】:对于 Ajv 验证器,您可以使用自定义 JSON-Schema 关键字 uniqueItemProperties : ajv-validator/ajv-keywords
【讨论】:
使用它不会产生有用的错误信息以上是关于确保数组中的项目属性在 Json Schema 中是唯一的?的主要内容,如果未能解决你的问题,请参考以下文章
Mongoose Schema 中的 JSON 中的 JS 数组