AJV JSON验证异常:特定JSON结构的规则修正需求
AJV JSON Schema 验证问题解决方案
核心设计思路
要实现你需要的二选一互斥验证、子属性类型校验和禁止非法属性,必须将oneOf与required、additionalProperties、type规则精准结合,每个oneOf分支仅约束对应合法场景的结构。
最终可直接使用的JSON Schema
{ "type": "object", "properties": { "QuoteDocuments": { "type": "object", "additionalProperties": false, "oneOf": [ { "required": ["CLQuoteXML"], "properties": { "CLQuoteXML": { "type": "object", "required": ["QuoteObject"], "properties": { "QuoteObject": { "type": "object" } }, "additionalProperties": false } } }, { "required": ["CLQuoteDocument"], "properties": { "CLQuoteDocument": { "type": "object", "required": ["CLQuoteObject"], "properties": { "CLQuoteObject": { "type": "object" } }, "additionalProperties": false } } } ] } }, "required": ["QuoteDocuments"], "additionalProperties": false }
关键规则解析
- 禁止非法属性:在根对象、
QuoteDocuments及两个子对象上均设置additionalProperties: false,直接拦截非法场景3(存在未定义属性)。 - 互斥二选一:
oneOf的两个分支分别仅声明对应合法场景的必填属性,且通过required强制该属性存在。当同时出现CLQuoteXML和CLQuoteDocument时,两个分支均不匹配,自动触发非法场景4的报错。 - 子属性类型校验:给
QuoteObject和CLQuoteObject明确指定type: "object",直接拦截非法场景5(子属性为字符串类型)。 - 必填子属性约束:每个分支内的子对象通过
required强制对应子属性存在,确保合法场景1和2的结构完整性。
原异常修复说明
你之前遇到的错误,本质是oneOf分支的约束不明确:既未限制分支内只能存在对应属性,也未精准定义子属性的必填规则。导致当CLQuoteDocument下出现QuoteObject时,既不匹配要求CLQuoteXML的分支,也不匹配要求CLQuoteDocument下是CLQuoteObject的分支,AJV因此提示未匹配oneOf规则。上述Schema通过明确每个分支的属性范围和子属性要求,彻底解决了该问题。
内容的提问来源于stack exchange,提问作者JG_GJ
相关产品推荐
相关产品推荐

