适配JSON Schema Draft 2020-12的枚举架构修改方案咨询
解决方法
问题根源
你的Schema虽然声明遵循Draft 2020-12规范,但使用了旧版(Draft 7及之前)的tuple定义方式,同时正则表达式的逻辑存在小问题,导致严格遵循规范的Jsonschema.net校验不通过:
- Draft 2020-12已废弃用
items数组定义tuple结构的写法,改用prefixItems关键字。 - 原正则表达式允许键名以点开头(
^.[^."]*$中的.匹配任意字符),不符合常规命名逻辑,且转义写法易混淆。
修改后的Schema
{ "$schema": "https://json-schema.org/draft/2020-12/schema", "title": "Module", "description": "Schema for module definitions", "type": "object", "properties": { "enums": { "type": "object", "patternProperties": { "^[^.\"]+$": { "$ref": "#/$defs/KeyValuePairArray" } }, "additionalProperties": false } }, "additionalProperties": false, "$defs": { "KeyValuePairArray": { "type": "array", "items": { "type": "array", "prefixItems": [ { "type": "string" }, { "type": "integer" } ], "minItems": 2, "maxItems": 2 } } } }
修改说明
- 替换tuple定义方式:将原
items数组改为prefixItems,这是Draft 2020-12中定义tuple结构的标准写法,明确指定数组第一个元素为字符串、第二个为整数。 - 修正正则表达式:将
^.[^."]*$改为^[^.\"]+$,确保:- 键名至少包含一个字符(
+表示匹配一次或多次) - 键名不包含点(
.)和双引号(")
- 键名至少包含一个字符(
- 重命名$defs中的schema:将原
enum改为KeyValuePairArray,避免与JSON Schema的内置enum关键字混淆,提升可读性。
示例JSON无需修改
你提供的示例JSON完全符合修改后的Schema要求,直接使用即可通过Jsonschema.net的校验:
{ "enums": { "Drive Types": [["DOL", 1], ["VSD", 2], ["Servo", 3]], "Conveyor State": [["Off", 0], ["Faulted", 1], ["Idle", 2]] } }
内容的提问来源于stack exchange,提问作者Cliff Pennalligen
相关产品推荐
相关产品推荐

