条件Json模式-响应相关

条件Json模式-响应相关,json,jsonschema,Json,Jsonschema,在下面的json示例中,“Vendor”是必需的,应该有一些值(minLength=1),但是当Mode=Ground时,它总是返回为空,因此对于下面的json响应,通用json模式失败。 Json响应如下所示: { "Res": { "Mem": [ { "Mode": "Flight", "Vendor": "YP", "MemNum": "222" }, { "Mode": "G

在下面的json示例中,“Vendor”是必需的,应该有一些值(minLength=1),但是当Mode=Ground时,它总是返回为空,因此对于下面的json响应,通用json模式失败。 Json响应如下所示:

{
  "Res": {
    "Mem": [
      {
        "Mode": "Flight",
        "Vendor": "YP",
        "MemNum": "222"
      },
      {
        "Mode": "Ground",
        "Vendor": "",
        "MemNum": "242"
      }
    ]
  }
}
在json响应中,两个“模式”都将始终返回。 是否可以创建自定义架构,我可以在其中指定: 当“模式”=“接地”时,使用schema1进行验证 对于所有其他“模式”,请参考schema2进行验证

我尝试了以下方法,但未能获得预期结果:

{
  "$schema": "http://json-schema.org/draft-04/schema#",
  "type": "object",
  "required": [
    "Res"
  ],
  "properties": {
    "Res": {
      "type": "object",
      "required": [
        "Mem"
      ],
      "properties": {
        "Mem": {
          "type": "array",
          "allOf": [
            {
              "$ref": "#/definitions/Flight"
            },
            {
              "$ref": "#/definitions/Ground"
            }
          ]
        }
      }
    }
  },
  "definitions": {
    "Flight": {
      "properties": {
        "Mode": {
          "enum": [
            "Flight"
          ]
        },
        "VendorCode": {
          "type": "string",
          "minLength": 1,
          "optional": false
        },
        "MemNum": {
          "type": "string",
          "minLength": 1,
          "optional": false
        }
      }
    },
    "Ground": {
      "properties": {
        "Mode": {
          "enum": [
            "Ground"
          ]
        },
        "VendorCode": {
          "type": "string"
        },
        "MemNum": {
          "type": "string",
          "minLength": 1,
          "optional": false
        }
      }
    }
  }
}

json模式中还有其他概念可以用于实现所需的结果吗?

这是一个相当尴尬的用例,但您可以将其与
“allOf”
“anyOf”
“not”
一起破解

模式:

{
    "oneOf" : [
        {
            "allOf" : [
                {
                    "$ref" : "#/definitions/ModeIsGround"
                },
                {
                    // schema1 comes here
                }
            ]
        },
        {
            "allOf" : [
                {
                    "not" : {
                        "$ref" : "#/definitions/ModeIsGround"
                    }
                },
                {
                    // schema2 comes here
                }
            ]
        }
    ],
    "definitions" : {
        "ModeIsGround" : {
            "properties" : {
                "Mode" : {
                    "enum" : ["Ground"]
                }
            }
        }
    }
}
您在问题中没有说明什么是schema1和schema2,而且您粘贴的schema格式不正确,所以我将它们简单地称为schema1和schema2

说明:所以在顶层,你说主题应该与其中一个子模式匹配。第一个子模式表示主题应该匹配“ModeIsGround”和schema1(这种情况您解释为“When”Mode“=“Ground”,validate with schema1”)。第二个子模式说主题不应该匹配“ModeIsGround”,而应该匹配schema2(这是“对于所有其他人”模式“引用schema2进行验证”部分)

这两个子模式与
“oneOf”
相结合,将实现您想要的功能

“Mode”=“Ground”谓词通过单元素枚举类型表示


我希望它能有所帮助。

这是一个相当尴尬的用例,但您可以将它与
的“allOf”
的“anyOf”
的“not”
一起破解

模式:

{
    "oneOf" : [
        {
            "allOf" : [
                {
                    "$ref" : "#/definitions/ModeIsGround"
                },
                {
                    // schema1 comes here
                }
            ]
        },
        {
            "allOf" : [
                {
                    "not" : {
                        "$ref" : "#/definitions/ModeIsGround"
                    }
                },
                {
                    // schema2 comes here
                }
            ]
        }
    ],
    "definitions" : {
        "ModeIsGround" : {
            "properties" : {
                "Mode" : {
                    "enum" : ["Ground"]
                }
            }
        }
    }
}
您在问题中没有说明什么是schema1和schema2,而且您粘贴的schema格式不正确,所以我将它们简单地称为schema1和schema2

说明:所以在顶层,你说主题应该与其中一个子模式匹配。第一个子模式表示主题应该匹配“ModeIsGround”和schema1(这种情况您解释为“When”Mode“=“Ground”,validate with schema1”)。第二个子模式说主题不应该匹配“ModeIsGround”,而应该匹配schema2(这是“对于所有其他人”模式“引用schema2进行验证”部分)

这两个子模式与
“oneOf”
相结合,将实现您想要的功能

“Mode”=“Ground”谓词通过单元素枚举类型表示


我希望它能有所帮助。

请正确格式化您的代码。问题中格式错误的代码会发送一条信息,表明您的问题并不重要,并为潜在的回答者提供了障碍。谢谢您,汤姆,我已经更正了格式!请正确格式化您的代码。问题中格式错误的代码会发送一条信息,表明您的问题并不重要,并为潜在的回答者提供了障碍。谢谢您,汤姆,我已经更正了格式!