条件Json模式-响应相关
在下面的json示例中,“Vendor”是必需的,应该有一些值(minLength=1),但是当Mode=Ground时,它总是返回为空,因此对于下面的json响应,通用json模式失败。 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
{
"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”谓词通过单元素枚举类型表示
我希望它能有所帮助。请正确格式化您的代码。问题中格式错误的代码会发送一条信息,表明您的问题并不重要,并为潜在的回答者提供了障碍。谢谢您,汤姆,我已经更正了格式!请正确格式化您的代码。问题中格式错误的代码会发送一条信息,表明您的问题并不重要,并为潜在的回答者提供了障碍。谢谢您,汤姆,我已经更正了格式!