Node.js中如何扁平化嵌套JSON并保留结构适配BigQuery?
解决方案:针对数组元素单独扁平化,去除索引前缀
要得到适合插入BigQuery的结构化行数据,你需要对result数组里的每个对象单独做扁平化处理,而不是把整个数组当成一个元素去扁平化。下面是两种可行的实现方式:
方式一:使用flat npm包(推荐,简洁稳定)
首先确保你已经安装了flat包:
npm install flat
然后修改你的代码,遍历数组中的每个对象并单独扁平化:
const flat = require('flat'); // 解析API响应 const apiResponse = JSON.parse(request.responseText); const resultItems = apiResponse.result; // 对每个元素单独扁平化,得到BigQuery兼容的行数组 const bigQueryRows = resultItems.map(item => flat(item, { maxDepth: 15 })); console.log("格式化后的行数据:", bigQueryRows);
这个代码会输出你期望的结果:一个包含两个扁平化对象的数组,每个对象的键名没有数字前缀,嵌套属性用.连接(比如rule.id)。
方式二:自定义扁平化函数(无需第三方依赖)
如果你不想引入额外包,可以自己实现一个递归扁平化函数:
// 自定义扁平化函数:将嵌套对象转为点连接键名的扁平对象 function flattenObject(obj, parentKey = '') { let flattened = {}; for (const key in obj) { if (obj.hasOwnProperty(key)) { const currentKey = parentKey ? `${parentKey}.${key}` : key; // 判断当前属性是否为非数组的嵌套对象 if (typeof obj[key] === 'object' && obj[key] !== null && !Array.isArray(obj[key])) { // 递归扁平化嵌套对象,合并结果 Object.assign(flattened, flattenObject(obj[key], currentKey)); } else { flattened[currentKey] = obj[key]; } } } return flattened; } // 处理API响应 const apiResponse = JSON.parse(request.responseText); const bigQueryRows = apiResponse.result.map(item => flattenObject(item)); console.log("格式化后的行数据:", bigQueryRows);
为什么你的原代码会出现数字前缀?
你之前的代码flatten([json], { maxDepth: 15 })是把整个result数组包裹在另一个数组里去扁平化,工具会把数组的索引(0、1)和元素的索引(0、1)都加到键名前,所以出现了0.0.activeFrom这种格式。而正确的做法是遍历数组里的每个对象,单独扁平化每个对象,这样就不会带上数组索引前缀了。
内容的提问来源于stack exchange,提问作者JSDevNewb99
相关产品推荐
相关产品推荐

