是否可以在JSON模式中具有动态大小的数组,其大小基于另一个值

时间:2017-10-05 15:11:07

标签: json schema jsonschema

我希望在JSON中存储一些计算器(用于现有游戏)的建筑数据。有些东西可以升级,有些则不能升级。它们是同一类型的建筑物。有没有办法根据最大级别的值动态设置数组大小的大小,还是我对JSON的期望过高?我打算开源这个工具,并希望有一个模式可以验证任何向其添加JSON文件的人。使用下面的代码,Visual Studio Code给出了一个关于maxItems如何期望整数的警告。

{
  "$schema": "http://json-schema.org/draft-06/schema#",
  "properties": {
    "$schema": {
      "type":"string"
    },
    "maxLevels": {
      "description": "The maximum level that this building can be upgraded to",
      "type":"integer",
      "enum": [
        1,
        5
      ]
    },
    "goldCapacity": {
      "description": "The maximum amount of gold that the building can hold.",
      "type":"array",
      "minItems": 1,
      "maxItems": {"$ref": "#/properties/maxLevels"},
      "items": {
        "type":"integer",
        "uniqueItems": true
      }
    }
  }
}

2 个答案:

答案 0 :(得分:2)

JSON(和JSON Schema)基本上是一组键/值对,因此仅JSON没有真正的支持来做你想做的事。

要完成您想要的任务,请使用maxItems的默认值(例如0)构造JSON,获取对JSON对象的引用,然后在使用JavaScript获得动态值后更新该值:

jsonObj['maxItems'] = yourCalculatedValue;

答案 1 :(得分:1)

the proposal for $data reference允许使用数据中的值作为某些模式关键字的值。使用$ data reference您可以:

{
  "$schema": "http://json-schema.org/draft-06/schema#",
  "properties": {
    "maxLevel": {
      "description": "The maximum level that this building can be upgraded to",
      "type":"integer",
      "minimum": 1,
      "maximum": 5
    },
    "goldCapacity": {
      "description": "The maximum amount of gold that the building can hold.",
      "type":"array",
      "minItems": 1,
      "maxItems": {"$data": "1/maxLevel"},
      "items": {
        "type":"integer",
        "uniqueItems": true
      }
    }
  }
}

通过这种方式,property" maxLevel" (应该是> = 1和< = 5)确定数组的最大项目数" goldCapacity"可以坚持。

目前只有ajv(JavaScript)实现了$ data引用,据我所知,它正在考虑包含在规范的下一个版本中(随意投票)。