NestJS开发API:BigQuery返回JSON结构转换方法求助
解决NestJS中BigQuery返回数据结构转换问题
我之前也碰到过BigQuery返回这种嵌套结构的情况,处理起来其实挺直接的,只需要两步就能把数据转成你想要的格式:
修改后的服务类代码
const rows = await bigqueryClient.query(queryData); // 提取BigQuery返回的内层数据数组(原结构是[ [数据列表] ]) const dataRows = rows[0] || []; // 遍历转换每个数据项的date_actual字段 const transformedRows = dataRows.map(row => ({ ...row, // 保留原有的所有字段 date_actual: row.date_actual?.value || row.date_actual // 直接取value值,兼容空值情况 })); console.log("transformed json"+JSON.stringify(transformedRows)); return transformedRows;
分步解释
提取单层数组:BigQuery的
query方法默认返回一个二维数组,外层数组仅包含一个元素——实际的数据列表。所以我们通过rows[0]取出内层数组,加上|| []是为了防止查询结果为空时出现undefined报错。转换date_actual字段:用
Array.map()遍历每个数据对象,通过扩展运算符...row保留原字段,然后覆盖date_actual字段,直接取它的value属性。这里的可选链?.和空值合并||是为了容错:如果某行的date_actual是null或不存在,就保留原字段值,避免抛出错误。
进阶优化(可选)
如果你的项目中有多个类似的字段需要转换,或者想更贴合NestJS的规范,可以用DTO+类转换器来处理:
首先定义一个DTO类,用class-transformer的@Transform装饰器处理字段转换:
import { Transform } from 'class-transformer'; export class YourDataDto { id: string; // 自动将嵌套的value属性提取出来 @Transform(({ value }) => value?.value || value) date_actual: string; Date: string; name: string; }
然后在服务中使用plainToInstance将原始数据转换为DTO实例:
import { plainToInstance } from 'class-transformer'; // ... const dataRows = rows[0] || []; const transformedRows = plainToInstance(YourDataDto, dataRows); return transformedRows;
这种方式不仅更易维护,还能配合class-validator做数据校验,非常适合大型项目。
内容的提问来源于stack exchange,提问作者sandy singh
相关产品推荐
相关产品推荐

