确保数组中的项属性在Json模式中是唯一的?

确保数组中的项属性在Json模式中是唯一的?,json,jsonschema,Json,Jsonschema,给定以下JSON模式,是否可以指示“name”属性应是唯一的(即“elements”数组中不应有两个具有相同“name”的项) { “根”:{ “类型”:“对象”, “财产”:{ “要素”:{ “类型”:“数组”, “迷你项目”:1, “项目”:{ “类型”:“对象”, “财产”:{ “姓名”:{ “类型”:“字符串”, “标题”:“元素名称”, “minLength”:3, }, “url”:{ “类型”:“字符串”, “标题”:“某些URL” } } } } } } } 我试图使用关键字,

给定以下JSON模式,是否可以指示“name”属性应是唯一的(即“elements”数组中不应有两个具有相同“name”的项)

{
“根”:{
“类型”:“对象”,
“财产”:{
“要素”:{
“类型”:“数组”,
“迷你项目”:1,
“项目”:{
“类型”:“对象”,
“财产”:{
“姓名”:{
“类型”:“字符串”,
“标题”:“元素名称”,
“minLength”:3,
},
“url”:{
“类型”:“字符串”,
“标题”:“某些URL”
}
}
}
}
}
}
}

我试图使用关键字,但它似乎是为简单的值列表而设计的。

不,这是不可能的。在文档中,json模式:…定义json数据结构的基于json的格式

对数据值进行验证是非常有限的,因为这不是本标准的目的。很多人以前都提出过这个问题,因为请求一种“唯一Id”功能是很常见的。不幸的是,对于需要它的人来说,json模式没有提供这一点


因此,如果要确保唯一性,唯一的选择是将“name”作为属性键,而不是属性值。

如果重构数据结构是一种选择,以下方法可能会有所帮助:

  • 用映射替换数组。这可以通过使用具有
    模式属性的对象来轻松实现。模式是正则表达式。匹配模式的任何对象都将根据模式属性的架构进行验证。匹配任何字符串>=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转换工具信息的链接:


在JSONata中处理示例案例非常简单。

对于Ajv validator,您可以使用自定义JSON模式关键字uniqueItemProperties:

我猜是通过指定
“uniqueItems”:true
。编辑之前从未使用过它:ietf定义:问题是5.3.4.2。成功验证的条件是:“如果实例的所有元素都是唯一的,则该实例将成功验证。”。但是您如何定义元素是否唯一?另外,您可能会对Thank感兴趣。事实上,这在当前的JSON模式标准中是不可能的。有一个讨论是否应该在该标准的未来版本中包含此功能:现在似乎可以了,参考文档:@dude,仍然不可能问题是要求在属性值中强制唯一性。您链接的数组中的唯一性在标准的早期版本中是可用的。但这并不能检查对象中的元素是否真的唯一。不幸的是,JSON规范建议在键()上强制唯一性。尽管如此,有些解析器确实强制执行唯一性。@yaccob这是JSON模式强制执行不可由JSON@citizenconn我明白你在说什么,但对我来说,你为什么这么说并不明显。你能解释一下吗?@yaccob老实说,伙计,我不记得了,我失去了上下文,对不起!