FlK*_*lKo 3 json jsonschema visual-studio-code
我对 MS Visual Studio Code(版本1.31.1 )的内置 JSON 模式验证有一个奇怪的问题,我试图在这里将其作为一个最小、完整且可验证的示例进行说明。
因此,对于此示例,假设我们有一个名为myjson.json的文件,应根据架构文件myschema.json对其进行验证(完整文件内容包含在下面)。
在这个星座中,我希望如果将鼠标指针直接移动到 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"}
]
}
}
}
Run Code Online (Sandbox Code Playgroud)
myjson.json
{
"$schema": "./myschema.json" ,
"foodItems": [
{
"name": "Apple",
"amount": 0
},
{
"name": "Orange",
"amount": 0
},
{
"name": "Cherry",
"amount": 0
}
]
}
Run Code Online (Sandbox Code Playgroud)
看起来你犯了一个很容易被忽视的错误。
items可以是 JSON 模式对象的数组,或 JSON 模式对象。
如果它是一个对象,那么适用数组中的所有项目都必须与子模式匹配(这就是您想要的)。
如果它是一个数组,它将数组中的模式应用到适用数组中相同索引处的对象(这就是您所拥有的)。
如果“items”是一个架构,则当
数组中的所有元素都成功针对该架构进行验证时,验证就会成功。如果“items”是架构数组,则如果
实例的每个元素都针对同一
位置(如果有)的架构进行验证,则验证成功。
https://datatracker.ietf.org/doc/html/draft-handrews-json-schema-validation-01#section-6.4.1
本质上,从属性值中删除架构周围的方括号items。
不过,我还没有检查您的架构是否存在其他问题。