首页 > 解决方案 > 如何使用对象在 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"
    ]
  }

谢谢你的帮助!:)

标签: jsonjsonschema

解决方案


我想到了!

{
  "$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"
      }
  }
}


推荐阅读