【问题标题】:JSON Schema v4 "required" in nested object嵌套对象中的 JSON Schema v4“必需”
【发布时间】:2015-07-27 22:57:15
【问题描述】:

我试过搜索,但我不太确定如何用文字表达!混淆的地方在于,当存在 同名嵌套键值时,“必需”在 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”。

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

我用我的模式测试了我的 JSON,但我可能在某个地方弄乱了我的代码,因为不再需要它了。

【问题讨论】:

    标签: json jsonschema


    【解决方案1】:

    您的架构存在一些问题,这可能导致您对 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 关键字只适用于定义它的架构。它不适用于任何父或子架构。

    【讨论】:

      【解决方案2】:

      LevelOneLevelOneRepeat 中的 id 只是巧合相关。它们必须独立指定为required

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2020-12-26
        • 1970-01-01
        • 2017-09-14
        • 2019-04-26
        • 1970-01-01
        • 2019-10-22
        • 1970-01-01
        • 2019-08-20
        相关资源
        最近更新 更多