我希望在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
}
}
}
}
答案 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引用,据我所知,它正在考虑包含在规范的下一个版本中(随意投票)。