You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

能否编写AJV自定义关键字实现对象属性重命名?

用AJV自定义关键字实现JSON属性重命名

这个需求完全可行,AJV支持自定义关键字,并且允许在验证过程中修改输入数据,刚好能满足属性重命名的需求。下面是具体实现步骤和示例代码:

实现思路

  1. 自定义一个inputName关键字,作用于对象的属性级别
  2. 给关键字配置modifying: true,允许它修改输入数据
  3. 在关键字的处理逻辑中完成三个核心操作:
    • 读取当前属性schema中inputName指定的输入字段名
    • 从输入对象中取出该字段的值,赋值给当前属性名
    • 删除输入对象中原有的那个字段

具体代码实现

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.21 14:31:06