如何(如果可能的话)在JSON模式中定义一个数组项属性应该是唯一的?

beg*_*gie 25 json jsonschema

鉴于以下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"
            }
          }
        }
      }
    }
  }
}
Run Code Online (Sandbox Code Playgroud)

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

jru*_*ren 23

不,这是不可能的.从文档中,json-schema:...一种基于JSON的格式,用于定义JSON数据的结构.

它对于进行数据值验证非常有限,因为它不是标准的目的.许多人之前已经问过这个问题,因为通常会要求一种"唯一ID"功能.不幸的是,对于那些需要它的人来说,json-schema并没有为你提供.

因此,如果您想确保唯一性,您唯一的选择是将"name"作为属性键而不是属性值.

  • @老兄,这仍然是不可能的。问题是要求加强财产价值的独特性。您链接的数组的唯一性在标准的早期版本中可用。 (5认同)
  • 谢谢.实际上,使用当前的JSON Schema标准是不可能的.讨论该功能是否应包含在该标准的未来版本中之一:https://groups.google.com/forum/?hl = en#!topic/json-schema/CYd8xk1Czyg (2认同)

yac*_*cob 8

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

  • 用地图替换数组.这可以通过使用对象轻松实现patternProperties.模式是正则表达式.匹配模式的任何对象都将根据pattern-property的模式进行验证.匹配任何字符串> = 3个字符的模式如下所示:"....*"但似乎".*"始终隐含尾随,因此"..."也可以.
  • 添加additionalProperties:false是强制执行约束(minLength:3)的附加步骤.
  • 要在地图中强制执行至少一个元素(您minItems:1用于数组),请替换minItemsminProperties.

...导致下面的架构:

"root": {
  "type": "object", 
  "properties": {
    "elements": {
      "type": "object", 
      "patternProperties": {
        "...": {
          "type": "object", 
          "properties": {
            "url": {
              "type": "string"
            }
          }
        }
      }, 
      "additionalProperties": false, 
      "minProperties": 1
    }
  }
}
Run Code Online (Sandbox Code Playgroud)

如果以下文档(摘录)与您的旧架构匹配,

"elements": [
  {
    "name": "abc", 
    "url": "http://myurl1"
  }, 
  {
    "name": "def", 
    "url": "http://myurl2"
  }, 
  {
    "name": "ghij", 
    "url": "http://myurlx"
  }
]
Run Code Online (Sandbox Code Playgroud)

...这样的文档(摘录)将匹配新架构:

"elements": {
  "abc": {
    "url": "http://myurl1"
  }, 
  "def": {
    "url": "http://myurl2"
  }, 
  "ghij": {
    "url": "http://myurlx"
  }
}
Run Code Online (Sandbox Code Playgroud)

  • 但这不会检查对象内的元素是否真的唯一 (2认同)

小智 5

对于 Ajv 验证器,您可以使用自定义 JSON-Schema 关键字uniqueItemPropertiesajv-validator/ajv-keywords

  • 使用它不会生成有用的错误消息 (2认同)