我试着搜索,但我不太确定如何用文字说话!混乱的关键是如何"要求"当嵌套键值与同名 时,在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,但是我可能已经把我的代码搞砸了,因为没有必要的工作了。
答案 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
约束不起作用的原因。了解我如何更改LevelOne
和LevelOneRepeat
定义。
一旦解决了这些问题,希望更清楚的是required
关键字仅适用于它所定义的模式。它不适用于任何父模式或子模式。
答案 1 :(得分:0)
sample.appsforyourdomain.gmailsettings.GmailSettingsService
和id
中的LevelOne
只是偶然相关的。它们必须独立指定为LevelOneRepeat
。