【问题标题】:Make sure item property in array is unique in Json Schema?确保数组中的项目属性在 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 关键字,但它似乎是为简单的值列表设计的。

【问题讨论】:

标签: json jsonschema


【解决方案1】:

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

进行数据值验证非常有限,因为它不是标准的目的。很多人之前都问过这个问题,因为请求一种“唯一 ID”功能是很常见的。不幸的是,对于那些需要它的人,json-schema 并没有为您提供。

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

【讨论】:

【解决方案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 中处理您的示例案例非常简单。

【讨论】:

    【解决方案4】:

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

    【讨论】:

    • 使用它不会产生有用的错误信息
    猜你喜欢
    • 1970-01-01
    • 2016-04-21
    • 1970-01-01
    • 2014-10-17
    • 1970-01-01
    • 1970-01-01
    • 2016-01-10
    • 2013-03-02
    • 2021-10-25
    相关资源
    最近更新 更多