Visual Studio Code 中的架构验证一次仅适用于第一个数组项

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 中的一个缺陷?

图 1 - 第一项的鼠标悬停和验证工作 鼠标悬停和验证适用于第一项

图 2 - 鼠标悬停和验证不适用于所有后续项目 鼠标悬停和验证不适用于所有后续项目


文件内容:


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)

Rel*_*ual 6

看起来你犯了一个很容易被忽视的错误。

items可以是 JSON 模式对象的数组,或 JSON 模式对象。

如果它是一个对象,那么适用数组中的所有项目都必须与子模式匹配(这就是您想要的)。

如果它是一个数组,它将数组中的模式应用到适用数组中相同索引处的对象(这就是您所拥有的)。

如果“items”是一个架构,则当
数组中的所有元素都成功针对该架构进行验证时,验证就会成功。

如果“items”是架构数组,则如果
实例的每个元素都针对同一
位置(如果有)的架构进行验证,则验证成功。

https://datatracker.ietf.org/doc/html/draft-handrews-json-schema-validation-01#section-6.4.1

本质上,从属性值中删除架构周围的方括号items

不过,我还没有检查您的架构是否存在其他问题。