【问题标题】:JSON schema for variable length array with some fixed items具有一些固定项的可变长度数组的 JSON 模式
【发布时间】:2020-08-02 08:21:22
【问题描述】:

我正在尝试定义一个模式来验证这种类型的数据数组:

[ 
'item1 string',         // item1, being a given string
2,                      // item2, an integer
'item3 string',         // item3, a variable string, repeated N times
'another item3 string', // ...
...
'last item3 string',    //
1.1,                    // item4, a number
]

item3 是字符串的集合,它会有所不同。没有重复,我的架构的简化版本是:

{
  type: 'array',
  minItems: 4,
  maxItems: 4,
  items: [
    { $ref: '#/definitions/item1' },
    { $ref: '#/definitions/item2' },
    { $ref: '#/definitions/item3' },
    { $ref: '#/definitions/item4' },
  ],
  definitions: {
    item1: { type: 'string' },
    item2: { type: 'integer' },
    item3: { type: 'string' },
    item4: { type: 'number' },
  },
}

我希望我的“项目”部分是一个数组,因为我想确保项目以正确的方式排序。但我不明白如何描述“item3”元素的重复。

我实际上提前知道了我期望的“item3”出现次数,所以现在我为每次检查重建架构(调整 mix/maxItems,并重复 item3 部分)。

但是有没有更有效的方法来解决这个问题?此架构用于 nodejs / ajv,如果在架构内不可行,是否有一个 ajv 功能会有所帮助? 谢谢。

【问题讨论】:

  • 嗨,威尔,我很想听听您的用例在这里,我的意思是实际数据/想要这个的原因是什么?在评估要添加到 JSON Schema 中的内容时,我们通常需要现实生活中的示例,因此我们根据实际需求而非学术理想进行更改。谢谢。
  • 嗨。也许我没有为此使用理想的工具,但这里我使用 ajv 来验证一些大型 sql 查询结果。 sql 查询的长度不同,指令是根据手头的情况构建和添加的。中间的指令都是一样的,它们是对应于我的例子的“item3”的,它们的结果都是使用相同的定义检查的。我不能对指令重新排序,这些重复指令之前和之后的指令必须按照这个顺序排列(比这个例子中的要多,而且架构当然更复杂)。如果您有任何问题,请告诉我,谢谢。
  • 我刚刚有了一个想法。如果您愿意并且能够将实现更改为(JASON Desrosiers 自己的)Hyper Jump 以进行 JSON Schema 验证,并更新为使用 JSON Schema 草案2019-09...我将能够为您提供完整的今天晚些时候的解释和例子! =]
  • 等等,不,我要疯了。没关系... =[
  • @Relequestual 很好,感谢您对此进行调查 :-) 我想我正在寻找的是一种“正则表达式”,但是将 json 模式放在一起,而不是字符串检查......也许它将成为未来架构规范的一部分!

标签: json jsonschema ajv


【解决方案1】:

这不是 JSON Schema 可以表达的。如果可变长度数组项最后出现,则可以完成。假设可以将 item4 移到 item3 之前,您可以这样做...

{
  "type": "array",
  "items": [
    { "$ref": "#/definitions/item1" },
    { "$ref": "#/definitions/item2" },
    { "$ref": "#/definitions/item4" }
  ],
  "additionalItems": { "$ref": "#/definitions/item3" }
}

如果你不能将变量项移动到最后,那你就不走运了。

【讨论】:

  • 这就是我害怕的。感谢您抽出宝贵时间!
猜你喜欢
  • 1970-01-01
  • 2012-05-28
  • 1970-01-01
  • 1970-01-01
  • 2020-10-16
  • 2017-11-11
  • 2020-04-12
  • 2018-11-16
  • 1970-01-01
相关资源
最近更新 更多