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

JSON字段名与JS/TS接口不匹配,如何映射数据至指定对象?

解决JSON字段与TypeScript接口字段映射问题

我来给你几个实用的解决方案,完全不需要修改数据库字段名或者接口变量名:

方法一:手动映射(无依赖,适合简单场景)

这是最直接的方式,把解析后的原始JSON对象手动转换成符合Invoice接口的结构:

// 假设你已经读取到JSON字符串
const rawJson = '[{"INV#": "123"}, {"INV#": "456"}]';

// 先解析成原始JS对象
const rawInvoices = JSON.parse(rawJson) as Array<{ "INV#": string }>;

class myclass {
  private inv: Invoice[];

  constructor() {
    // 手动映射为Invoice数组,同时转换类型
    this.inv = rawInvoices.map(item => ({
      invoiceNumber: parseInt(item["INV#"], 10)
    }));
  }
}

这种方式不需要额外安装依赖,逻辑清晰,适合字段较少的场景。

方法二:使用class-transformer库(适合复杂项目)

如果你的数据结构比较复杂、字段较多,可以用class-transformer库通过装饰器实现字段映射。首先安装依赖:

npm install class-transformer --save

然后把Invoice从接口改为类(TypeScript接口编译后不存在,装饰器只能作用于类),添加装饰器指定字段别名:

import { Expose, plainToInstance, Type } from 'class-transformer';

// 将interface改为class并配置装饰器
export class Invoice {
  @Expose({ name: 'INV#' }) // 指定JSON中的原始字段名
  @Type(() => Number) // 自动将字符串类型转换为number
  invoiceNumber: number;
}

class myclass {
  private inv: Invoice[];

  constructor() {
    const rawJson = '[{"INV#": "123"}, {"INV#": "456"}]';
    const rawInvoices = JSON.parse(rawJson);
    
    // 把原始对象转换为Invoice实例数组
    this.inv = plainToInstance(Invoice, rawInvoices, {
      excludeExtraneousValues: true // 只保留被@Expose标记的属性
    });
  }
}

这种方式扩展性强,后续新增字段只需添加对应装饰器即可。

方法三:使用JSON.parse的reviver函数(无依赖,解析时直接转换)

利用JSON.parse的第二个参数reviver函数,在解析JSON的同时完成字段映射和类型转换:

class myclass {
  private inv: Invoice[];

  constructor() {
    const rawJson = '[{"INV#": "123"}, {"INV#": "456"}]';
    
    this.inv = JSON.parse(rawJson, (key, value) => {
      // 识别包含"INV#"的对象,直接转换为Invoice结构
      if (typeof value === 'object' && value !== null && 'INV#' in value) {
        return {
          invoiceNumber: parseInt(value['INV#'], 10)
        };
      }
      return value;
    }) as Invoice[];
  }
}

这种方式把转换逻辑嵌入到JSON解析过程中,代码简洁,同样不需要额外依赖。

内容的提问来源于stack exchange,提问作者Sandro Del Valle Arocha

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.26 09:37:44