JSON Schema v4"必需"在嵌套对象中

时间:2015-07-27 22:57:16

标签: json jsonschema

我试着搜索,但我不太确定如何用文字说话!混乱的关键是如何"要求"当嵌套键值与同名 时,在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"和"名称"。

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

我用我的架构测试了我的JSON,但是我可能已经把我的代码搞砸了,因为没有必要的工作了。

2 个答案:

答案 0 :(得分:10)

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

答案 1 :(得分:0)

sample.appsforyourdomain.gmailsettings.GmailSettingsServiceid中的LevelOne只是偶然相关的。它们必须独立指定为LevelOneRepeat