首页 > 解决方案 > Visual Studio Code 中的架构验证一次仅适用于第一个数组项

问题描述

我对 MS Visual Studio Code (Ver. 1.31.1 )的内置 JSON 模式验证有一个奇怪的问题,我试图在这里作为一个最小的完整的和可验证的示例进行说明。

所以对于这个例子,假设我们有一个名为myjson.json的文件,它应该根据模式文件myschema.json进行验证(完整的文件内容包含在下面)。

在这个星座中,我希望如果您将鼠标指针直接移动到项目(或项目值)n 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"}
            ]
        }
    }
}

我的json.json

{
    "$schema": "./myschema.json"  ,
    "foodItems": [
        {
            "name": "Apple",
            "amount": 0
        },
        {
            "name": "Orange",
            "amount": 0
        },
        {
            "name": "Cherry",
            "amount": 0        
        }
    ] 
}

标签: jsonvisual-studio-codejsonschema

解决方案


看起来你犯了一个很容易错过的错误。

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

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

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

如果“items”是一个模式,则如果
数组中的所有元素都成功地针对该模式进行验证,则验证成功。

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

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

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

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


推荐阅读