JSON 嵌套对象中的模式 v4 "required"

JSON Schema v4 "required" in nested object

我试过搜索,但我不太确定如何用文字表达!混淆点是 "required" 如何在 JSON 模式 v4 中工作时 嵌套键值具有 相同的名称 .

例如,这个架构:

{
    "Root": {
        "type": ["array", "null"],
        "items": {
            "type": "object",
            "properties": {
                "LevelOne": {
                    "required": ["id", "name", "LevelOneRepeat"],
                    "id": {
                        "type": "string"
                        },
                    "name": {
                        "type": "string"
                        },
                    "LevelOneRepeat": {
                        "type": ["array", "null"],
                        "items": {
                            "type": "object",
                            "properties": {
                                "required": ["id", "name"],
                                "id": {
                                    "type": "string"
                                    },
                                "name": {
                                    "type": "string"
                                }
                            }
                        }
                    }
                }
            }
        }
    }
}

在 LevelOne 内部,我需要 "id"、"name" 和 "LevelOneRepeat"。但是,在 LevelOneRepeat 中,我还需要 "id" 和 "name"。

required 是只检查同一级别的元素,还是检查所有子元素?如果所需的键值(同名)已在上面的级别中列出,我是否需要在 LevelOneRepeat 中包含所需的内容?

我用我的架构测试了我的 JSON,但我可能在某处搞砸了我的代码,因为不再需要工作了。

LevelOneLevelOneRepeat中的id只是巧合。它们必须单独指定为 required.

您的架构存在一些问题,这可能导致您对 required 的工作方式感到困惑。

这是更正后的架构。

{
    "type": ["array", "null"],
    "items": {
        "type": "object",
        "properties": {
            "LevelOne": {
                "type": "object",
                "properties": {
                    "id": { "type": "string" },
                    "name": { "type": "string" },
                    "LevelOneRepeat": {
                        "type": ["array", "null"],
                        "items": {
                            "type": "object",
                            "properties": {
                                "id": { "type": "string" },
                                "name": { "type": "string" }
                            },
                            "required": ["id", "name"]
                        }
                    }
                },
                "required": ["id", "name", "LevelOneRepeat"],
            }
        }
    }
}

第一个问题是您定义嵌套对象的方式。每个 属性 的值必须是一个架构。查看我如何更改 LevelOne 定义以查看如何正确定义嵌套对象。

第二个问题是 required 关键字在错误的位置。它应该与 properties 关键字处于同一级别,而不是嵌套在 properties 对象中。这就是您的 required 约束不起作用的原因。看看我是如何更改 LevelOneLevelOneRepeat 定义的。

一旦你解决了这些问题,希望它应该更清楚 required 关键字只适用于定义它的模式。它不适用于任何父模式或子模式。