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

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;

分步解释

  1. 提取单层数组:BigQuery的query方法默认返回一个二维数组,外层数组仅包含一个元素——实际的数据列表。所以我们通过rows[0]取出内层数组,加上|| []是为了防止查询结果为空时出现undefined报错。

  2. 转换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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.09 17:42:48