json - Visual Studio Code 中的架构验证一次仅适用于第一个数组项
问题描述
我对 MS Visual Studio Code (Ver. 1.31.1 )的内置 JSON 模式验证有一个奇怪的问题,我试图在这里作为一个最小的、完整的和可验证的示例进行说明。
所以对于这个例子,假设我们有一个名为myjson.json的文件,它应该根据模式文件myschema.json进行验证(完整的文件内容包含在下面)。
在这个星座中,我希望如果您将鼠标指针直接移动到项目(或项目值)n VSCode 的编辑器上,将显示来自模式文件的相应描述文本。
相反,这仅适用于foodItems中的第一项(图 1)。所有其他项目均未显示任何内容。(图 2)。看起来编辑器根本没有处理其他项目。
我在这里做错了什么还是这是 VSCode 中的一个缺陷?
文件内容:
myschema.json
{
"$schema": "http://json-schema.org/draft-07/schema#",
"title": "My Schema",
"type": "object",
"properties": {
"foodItems": {
"type": "array",
"items": [ {"$ref": "#/definitions/foodItem"} ]
}
},
"definitions": {
"foodItemApple": {
"type": "object",
"properties": {
"name": {
"const": "Apple"
},
"amount": {
"type": "number",
"description": "The current amount of apples"
}
},
"required": ["name", "amount"],
"additionalProperties": false
},
"foodItemOrange": {
"type": "object",
"properties": {
"name": {
"const": "Orange"
},
"amount": {
"type": "number",
"description": "The current amount of oranges"
}
},
"required": ["name", "amount"
],
"additionalProperties": false
},
"foodItemCherry": {
"type": "object",
"properties": {
"name": {
"const": "Cherry"
},
"amount": {
"type": "number",
"description": "The current amount of cherries"
}
},
"required": ["name", "amount"],
"additionalProperties": false
},
"foodItem": {
"anyOf": [
{"$ref": "#/definitions/foodItemApple"},
{"$ref": "#/definitions/foodItemOrange"},
{"$ref": "#/definitions/foodItemCherry"}
]
}
}
}
我的json.json
{
"$schema": "./myschema.json" ,
"foodItems": [
{
"name": "Apple",
"amount": 0
},
{
"name": "Orange",
"amount": 0
},
{
"name": "Cherry",
"amount": 0
}
]
}
解决方案
看起来你犯了一个很容易错过的错误。
items
可以是 JSON 模式对象的数组,也可以是 JSON 模式对象。
如果它是一个对象,那么适用数组中的所有项目都必须与子模式匹配(这是您想要的)。
如果它是一个数组,它将数组中的模式应用于相同索引处的适用数组中的对象(这就是你所拥有的)。
如果“items”是一个模式,则如果
数组中的所有元素都成功地针对该模式进行验证,则验证成功。如果“items”是模式数组,则如果
实例的每个元素都针对同一
位置的模式进行验证(如果有),则验证成功。
https://datatracker.ietf.org/doc/html/draft-handrews-json-schema-validation-01#section-6.4.1
items
本质上,从属性值中删除架构周围的方括号。
不过,我还没有检查您的架构是否有其他问题。
推荐阅读
- python - Python:正则表达式,在字符串上查找重复
- azure - 生成不记名令牌时签名无效
- python - 获取python中嵌套最深的dict的值
- xmlunit-2 - XMLUnit NodeFilter 没有发现差异
- java - 在同一窗口中打开另一个 GridPane
- java - 有没有办法在eclipse中隐藏一个包?(也许是出于安全原因?)
- soapui - 如何在Property transfer中将TestCase自定义属性值设置为Xpath中的参数
- php - PHP CURL 如何过滤 json 结果?
- swift - 如何在 Playgrounds 中获取 Slider 值?
- python - 从 excel - Python - xlrd 读取命名范围