Javascript 嵌套对象的AJV模式验证
函数返回如下所示的对象:Javascript 嵌套对象的AJV模式验证,javascript,json,node.js,jsonschema,ajv,Javascript,Json,Node.js,Jsonschema,Ajv,函数返回如下所示的对象: { "answer": { "vehicle_type": 1, "message": "Car" }, "model": "VW", "color": "red" } “答案”对象始终存在。其他字段基于“车辆类型”存在 例如 如果车辆类型=1,则有“型号”和“颜色” 如果车辆类型=2,则有“发动机计数”、“座椅计数”和“机翼计数” 我正在尝试编
{
"answer": {
"vehicle_type": 1,
"message": "Car"
},
"model": "VW",
"color": "red"
}
“答案”对象始终存在。其他字段基于“车辆类型”存在
例如
如果车辆类型=1,则有“型号”和“颜色”
如果车辆类型=2,则有“发动机计数”、“座椅计数”和“机翼计数”
我正在尝试编写JSON模式,我将使用它来验证返回的对象
如果“车辆类型”为1,我想将“型号”和“颜色”设置为所需属性。
如果“车辆类型”为2,则需要“发动机计数”、“座椅计数”和“机翼计数”
我正在使用AJV()模式验证器
对我来说,这是有问题的,因为vehicle_type嵌套在“answer”中,而我想要标记为所需的属性位于父对象上。
换句话说,“验证类型”与“模型”或“引擎计数”不在同一级别
我已经有几个不同的方法。。。我也尝试了ajv关键词(switch,if/else/then),但没有任何运气
有什么想法吗?您可以使用“oneOf”属性
您将拥有1型或2型车辆中的“一个”。类型1具有某些必需属性,而类型2具有不同的必需属性
例如:
{
"$schema": "http://json-schema.org/draft-04/schema#",
"id": "http://some.site.somewhere/entry-schema#",
"oneOf": [
{"$ref": "#/definitions/type1"},
{"$ref": "#/definitions/type2"}
],
"definitions": {
"type1": {
"type": "object",
"properties": {
"answer": {
"type": "object",
"properties": {
"vehicle_type": {
"type": "integer",
"enum": [1]
},
"message": {
"type": "string"
}
}
},
"model": {
"type": "string"
},
"color": {
"type": "string"
}
},
"required": [
"model",
"color"
]
},
"type2": {
"type": "object",
"properties": {
"answer": {
"type": "object",
"properties": {
"vehicle_type": {
"type": "integer",
"enum": [2]
},
"message": {
"type": "string"
}
}
},
"engine_count": {
"type": "integer"
},
"seat_count": {
"type": "integer"
},
"wing_count": {
"type": "integer"
}
},
"required": [
"engine_count",
"seat_count",
"wing_count"
]
}
}
}
您可以使用“oneOf”属性来实现此目的
您将拥有1型或2型车辆中的“一个”。类型1具有某些必需属性,而类型2具有不同的必需属性
例如:
{
"$schema": "http://json-schema.org/draft-04/schema#",
"id": "http://some.site.somewhere/entry-schema#",
"oneOf": [
{"$ref": "#/definitions/type1"},
{"$ref": "#/definitions/type2"}
],
"definitions": {
"type1": {
"type": "object",
"properties": {
"answer": {
"type": "object",
"properties": {
"vehicle_type": {
"type": "integer",
"enum": [1]
},
"message": {
"type": "string"
}
}
},
"model": {
"type": "string"
},
"color": {
"type": "string"
}
},
"required": [
"model",
"color"
]
},
"type2": {
"type": "object",
"properties": {
"answer": {
"type": "object",
"properties": {
"vehicle_type": {
"type": "integer",
"enum": [2]
},
"message": {
"type": "string"
}
}
},
"engine_count": {
"type": "integer"
},
"seat_count": {
"type": "integer"
},
"wing_count": {
"type": "integer"
}
},
"required": [
"engine_count",
"seat_count",
"wing_count"
]
}
}
}