
本教程深入探讨了json schema中如何实现基于特定枚举值的条件验证,以动态控制顶层属性的必填性。文章通过一个实际案例,详细解析了当一个属性(如`items`)的必填性取决于另一个嵌套属性(如`attributes.order_type`)的值时,如何正确使用`if`/`then`关键字在根级别进行条件判断,从而避免常见的验证错误,确保数据模型的灵活性与准确性。
JSON Schema是描述JSON数据结构和格式的强大工具,广泛应用于API设计、数据验证和文档生成。在实际应用中,数据模型往往存在复杂的业务逻辑,其中某些字段的必填性可能依赖于其他字段的值。例如,在一个订单系统中,如果订单类型是“ORDER”,则必须包含商品列表(items),而其他订单类型(如“TRANSFER”)则不需要。这种“条件必填”的场景是JSON Schema条件验证功能的核心应用之一。
本文将通过一个具体的案例,详细讲解如何在JSON Schema中利用if/then关键字,根据嵌套属性的枚举值来动态控制顶层属性的必填性。
假设我们有一个订单(Order)的JSON数据模型,其中包含以下关键属性:
我们的业务需求是:
在尝试实现这一逻辑时,开发者常遇到的挑战是,如何正确地将条件逻辑放置在JSON Schema中,使其能够跨越层级,根据嵌套属性的值来影响顶层属性的验证。常见的错误尝试包括:
JSON Schema Draft 07及更高版本引入了if、then和else关键字,用于实现基于条件的模式验证。
理解这些关键字的关键在于,它们所定义的模式(包括properties、required等)都作用于当前正在被验证的JSON数据上下文。如果if/then位于根级别,那么它们就作用于整个JSON文档。如果它们位于某个属性的定义内部,则作用于该属性的值。
为了解决上述问题,我们需要将条件逻辑放置在JSON Schema的根级别,并确保if条件能够准确地描述出attributes.order_type的嵌套路径和值。
以下是实现这一条件的完整JSON Schema示例:
{
"$schema": "http://json-schema.org/draft-07/schema#",
"$id": "http://json-schema.org/draft-07/schema#",
"title": "订单数据验证方案",
"type": "object",
"properties": {
"warehouse_id": {
"type": "string",
"description": "仓库ID"
},
"operation_type": {
"type": "string",
"description": "操作类型"
},
"order_id": {
"type": "number",
"description": "订单唯一标识符"
},
"items": {
"type": "array",
"description": "商品列表",
"minItems": 1,
"items": {
"type": "object",
"properties": {
"sku": {
"type": "string",
"minLength": 1,
"maxLength": 50,
"description": "商品SKU"
},
"quantity": {
"type": "integer",
"minimum": 1,
"description": "商品数量"
}
},
"required": ["sku", "quantity"],
"additionalProperties": false
}
},
"attributes": {
"type": "object",
"description": "订单附加属性",
"properties": {
"order_type": {
"type": "string",
"enum": ["ORDER", "TRANSFER", "WITHDRAWAL", "DISPOSAL", "FRESH"],
"description": "订单类型"
},
"etd": {
"type": "string",
"pattern": "^(\d{4})-(0[1-9]|1[0-2])-(0[1-9]|[12][0-9]|3[01])(?:T)(0[0-9]|1[0-9]|2[0-3]):(0[0-9]|1[0-9]|2[0-9]|3[0-9]|4[0-9]|5[0-9]):(0[0-9]|1[0-9]|2[0-9]|3[0-9]|4[0-9]|5[0-9])(?:Z)$",
"description": "预计离港日期/时间 (ISO 8601 UTC)"
},
"volume": {
"type": ["integer", "null"],
"minimum": 0,
"description": "订单总体积"
},
"typology": {
"type": ["string", "null"],
"enum": ["CONVEYABLE", "NON_CONVEYABLE"],
"description": "订单类型学 (仅限ORDER类型)"
}
},
"required": ["order_type", "etd"],
"additionalProperties": false
}
},
"required": [
"warehouse_id",
"operation_type",
"attributes"
],
"additionalProperties": false,
"allOf": [
{
"if": {
"type": "object",
"properties": {
"attributes": {
"type": "object",
"properties": {
"order_type": { "const": "ORDER" }
},
"required": ["order_type"]
}
},
"required": ["attributes"]
},
"then": { "required": ["items"] }
}
]
}以上就是JSON Schema条件验证:根据枚举值动态控制属性必填性的详细内容,更多请关注php中文网其它相关文章!
每个人都需要一台速度更快、更稳定的 PC。随着时间的推移,垃圾文件、旧注册表数据和不必要的后台进程会占用资源并降低性能。幸运的是,许多工具可以让 Windows 保持平稳运行。
Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号