JSON Schema嵌套属性验证失效,如何基于eventName校验eventPayload/totalAmount
问题原因与解决方案
你遇到的核心问题是条件校验的上下文错误:当前你把if规则写在了totalAmount字段的Schema内部,此时校验的实例是totalAmount本身(一个数字/整数),而eventName是在根节点(或eventPayload的父节点),所以properties.eventName根本找不到对应的字段,导致条件永远不触发,自然不会执行then/else里的校验规则。
正确实现方式
需要将条件校验规则移到能访问到eventName的层级(比如根Schema),然后在then分支中对eventPayload.totalAmount进行针对性约束。同时注意:minLength是字符串类型的校验关键字,不能用于数字,需要删除。
以下是修正后的完整Schema示例:
{ "type": "object", "properties": { "eventName": { "type": "string" }, "eventPayload": { "type": "object", "properties": { "totalAmount": { "type": ["integer", "number"], "multipleOf": 0.01 } } } }, "allOf": [ // 当eventName为Test10/Test12时,totalAmount必须大于0 { "if": { "properties": { "eventName": { "enum": ["Test10", "Test12"] } }, "required": ["eventName"] }, "then": { "properties": { "eventPayload": { "properties": { "totalAmount": { "exclusiveMinimum": 0 } }, "required": ["totalAmount"] } } } }, // 当eventName为Test1/Test2/Test3时,totalAmount必须小于0 { "if": { "properties": { "eventName": { "enum": ["Test1", "Test2", "Test3"] } }, "required": ["eventName"] }, "then": { "properties": { "eventPayload": { "properties": { "totalAmount": { "exclusiveMaximum": 0 } }, "required": ["totalAmount"] } } } } ] }
关键说明
- 层级调整:将
if条件放在根Schema的allOf数组中,此时校验实例是整个JSON对象,能正常访问到eventName字段。 - 必填约束:在
if中添加required: ["eventName"],确保只有当eventName存在且符合枚举值时,才触发对应的then规则。 - 移除错误关键字:删除
totalAmount下的minLength,该关键字仅适用于字符串类型,对数字无效。
内容的提问来源于stack exchange,提问作者Loren
相关产品推荐
相关产品推荐

