能否编写AJV自定义关键字实现对象属性重命名?
用AJV自定义关键字实现JSON属性重命名
这个需求完全可行,AJV支持自定义关键字,并且允许在验证过程中修改输入数据,刚好能满足属性重命名的需求。下面是具体实现步骤和示例代码:
实现思路
- 自定义一个
inputName关键字,作用于对象的属性级别 - 给关键字配置
modifying: true,允许它修改输入数据 - 在关键字的处理逻辑中完成三个核心操作:
- 读取当前属性schema中
inputName指定的输入字段名 - 从输入对象中取出该字段的值,赋值给当前属性名
- 删除输入对象中原有的那个字段
- 读取当前属性schema中
具体代码实现
const Ajv = require('ajv'); // 1. 创建AJV实例,启用数据修改权限 const ajv = new Ajv({ modifyData: true }); // 2. 注册自定义关键字inputName ajv.addKeyword({ keyword: 'inputName', type: 'object', // 关键字作用在对象的属性schema上 modifying: true, // 声明该关键字会修改输入数据 schemaType: 'string', // inputName的值为字符串类型 // 验证与转换逻辑 validate: function(schema, _, parentSchema, __, parentData, parentDataProperty) { // schema是inputName指定的原字段名(比如示例中的"inputFoo") // parentData是待处理的输入对象 // parentDataProperty是目标属性名(比如示例中的"bar") if (parentData && typeof parentData === 'object' && schema in parentData) { // 将原字段的值赋值给目标属性 parentData[parentDataProperty] = parentData[schema]; // 删除原输入字段 delete parentData[schema]; } // 返回true表示验证通过(可根据需求添加额外校验逻辑) return true; } }); // 3. 定义目标JSON Schema const schema = { "type": "object", "properties": { "foo": { "type": "string" }, "bar": { "type": "number", "inputName": "inputFoo" } } }; // 4. 编译schema得到验证函数 const validate = ajv.compile(schema); // 5. 待处理的输入数据 const inputData = { "foo": "string", "inputFoo": 123 }; // 6. 执行验证(同时完成数据转换) const valid = validate(inputData); if (valid) { console.log('验证通过,转换后的数据:', inputData); // 输出结果:{ foo: 'string', bar: 123 } } else { console.log('验证失败:', validate.errors); }
补充说明
- 如果要求
inputName指定的字段必须存在,可以在validate函数中添加判断,返回false并生成对应的错误信息 - 上述代码会直接修改原输入对象,若需保留原数据,可先深拷贝一份再传入验证函数
- 可根据需求扩展关键字逻辑,比如支持嵌套对象的属性重命名
内容的提问来源于stack exchange,提问作者Lehks
相关产品推荐
相关产品推荐

