json - 如何使用对象在 JSON 模式中创建一个或多个选项?
问题描述
对不起,如果之前已经发布过!我找不到适合我的用例并且有效的答案:(
我有以下 JSON ( JSON 1 ),我正在为它编写一个 JSON 模式(见最后)。大多数情况下,除了我们有 prop5 和里面的对象之外,一切都有效。
JSON 1
"prop1": "somestuff",
"prop2": "morestuff",
"temp_list": [
"stuff",
"otherstuff",
"final stuff"
],
"prop4": "morestuff",
"prop5": {
"sub_prop_1": {
"more_properties": "temp",
"and_even_more": "temp"
}
},
"prop6": "finallyDone"
}
我想创建一个选项,我可以在JSON 2中拥有三个“子道具”中的一个或多个。
JSON 2
{
"prop1": "somestuff",
"prop2": "morestuff",
"temp_list": [
"stuff",
"otherstuff",
"final stuff"
],
"prop4": "morestuff",
"prop5": {
"sub_prop_1": {
"more_properties": "temp",
"and_even_more": "temp"
},
"sub_prop_2": {
"randomProp": "stuff",
"anotherOne": "moreStuff"
},
"sub_prop_3": {
"last_random_prop": "somestuff"
}
},
"prop6": "finallyDone"
}
两个 JSON 都应该是有效的。
但是,我认为我没有正确编写架构。当前行为接受可能在“prop 5”下列出的任何属性,无论在“sub props”中输入的值的名称和类型如何。
预期的行为是我拥有三个“sub_props”中的一个或多个,以及每个可能具有的任何其他字符串属性。
这是我到目前为止的架构,如何修复我的架构以具有三个“sub_props”中的一个或多个?我相信我应该使用 , anyOf
,但我还不能正确使用它。
JSON 架构
{
"type": "object",
"properties": {
"prop1": {
"type": "string"
},
"prop2": {
"type": "string"
},
"temp_list": {
"type": "array",
"items": [
{
"type": "string"
},
{
"type": "string"
},
{
"type": "string"
}
]
},
"prop4": {
"type": "string"
},
"prop5": {
"type": "object",
"anyOf":[
{
"properties": {
"sub_prop_1": {
"type": "object",
"additionalProperties": {
"type": "string"
},
"sub_prop_2": {
"type": "object",
"additionalProperties": {
"type": "string"
}
},
"sub_prop_3": {
"type": "object",
"additionalProperties": {
"type": "string"
}
}
}
}}
]
},
"prop6": {
"type": "string"
}
},
"required": [
"prop1",
"prop2",
"temp_list",
"prop4",
"prop5",
"prop6"
]
}
谢谢你的帮助!:)
解决方案
我想到了!
{
"$schema": "http://json-schema.org/draft-06/schema#",
"$ref": "#/definitions/Welcome8",
"definitions": {
"Welcome8": {
"type": "object",
"additionalProperties": false,
"properties": {
"prop1": {
"type": "string"
},
"prop2": {
"type": "string"
},
"temp_list": {
"type": "array",
"items": {
"type": "string"
}
},
"prop4": {
"type": "string"
},
"prop5": {
"$ref": "#/definitions/Prop5"
},
"prop6": {
"type": "string"
}
},
"required": [
"prop1",
"prop2",
"prop4",
"prop5",
"prop6",
"temp_list"
],
"title": "Welcome8"
},
"Prop5": {
"type": "object",
"minProperties":1,
"additionalProperties": false,
"properties": {
"sub_prop_1": {
"$ref": "#/definitions/SubProp1"
},
"sub_prop_2": {
"$ref": "#/definitions/SubProp2"
},
"sub_prop_3": {
"$ref": "#/definitions/SupProp3"
}
},
"anyOf": [
{"required": ["sub_prop_1"]},
{"required": ["sub_prop_2"]},
{"required": ["sub_prop_3"]}
],
"title": "Prop5"
},
"SubProp1": {
"type": "object",
"additionalProperties": {
"type": "string"
},
"title": "SubProp1"
},
"SubProp2": {
"type": "object",
"additionalProperties": {
"type": "string"
},
"title": "SubProp2"
},
"SupProp3": {
"type": "object",
"additionalProperties": {
"type": "string"
},
"title": "SupProp3"
}
}
}
推荐阅读
- python - 为MultiIndex DataFrame的交叉选择分配值(numpy的省略号样式)
- git - 如何处理由目标分支中移动的文件引起的合并冲突
- python - Python:使用 map 和 reduce 编写外积
- html - 为什么双引号 urlencoded 为 %22?
- python - 等待 bash 提示出现的 Python 脚本
- asp.net - 使用 vbscript ASP 获取 XML 中的值节点
- java - 使用 Fat Jars 优于 Container 的优势
- sharepoint - Sharepoint 2010 设计器文档审批工作流程
- javascript - 尝试在 guillotine.js 中显示具有动态宽度和高度的图像。在固定宽度和高度下工作正常
- gremlin - Python Gremlin 中的顶点未更新