如何反序列化含动态键值对的JSON响应并转换为指定格式
解决方案:将嵌套JSON转换为按时间戳拆分的单条记录
核心思路
遍历原始JSON数组中的每个用户数据对象,提取user_id后,以时间戳为维度,将同一时间点的hr、rr、snoring值整合为单条独立记录。
代码实现(JavaScript)
假设原始数据中hr、rr、snoring的时间戳完全一致,可直接用以下代码转换:
const originalData = [ { "user_id":30826889, "hr":{"1664325660":65,"1664325720":65,"1664325780":70}, "rr":{"1664325660":18,"1664325720":17,"1664325780":15}, "snoring":{"1664325660":0,"1664325720":0,"1664325780":0} }, { "user_id":30826889, "hr":{"1664340780":72,"1664340840":70,"1664340900":71,"1664340960":70,"1664341020":67,"1664341080":71,"1664341140":69,"1664341200":68,"1664341260":66,"1664341320":68}, "rr":{"1664340780":20,"1664340840":20,"1664340900":19,"1664340960":20,"1664341020":19,"1664341080":19,"1664341140":19,"1664341200":21,"1664341260":22,"1664341320":22}, "snoring":{"1664340780":0,"1664340840":0,"1664340900":0,"1664340960":0,"1664341020":0,"1664341080":0,"1664341140":0,"1664341200":0,"1664341260":0,"1664341320":0} } ]; const transformedRecords = []; originalData.forEach(dataItem => { const userId = dataItem.user_id; // 提取所有时间戳(从hr字段的键中获取) const timestamps = Object.keys(dataItem.hr); timestamps.forEach(timestamp => { transformedRecords.push({ user_id: userId, timestamp: timestamp, hr: dataItem.hr[timestamp], rr: dataItem.rr[timestamp], snoring: dataItem.snoring[timestamp] }); }); }); // 输出每条转换后的记录 transformedRecords.forEach(record => { console.log(JSON.stringify(record)); });
处理时间戳不一致的情况
如果hr、rr、snoring的时间戳可能存在差异,可通过取时间戳并集的方式处理,缺失值设为null:
originalData.forEach(dataItem => { const userId = dataItem.user_id; // 获取所有时间戳的并集 const allTimestamps = new Set([ ...Object.keys(dataItem.hr), ...Object.keys(dataItem.rr), ...Object.keys(dataItem.snoring) ]); allTimestamps.forEach(timestamp => { transformedRecords.push({ user_id: userId, timestamp: timestamp, hr: dataItem.hr[timestamp] ?? null, rr: dataItem.rr[timestamp] ?? null, snoring: dataItem.snoring[timestamp] ?? null }); }); });
输出示例
运行代码后,会输出符合需求的单条JSON记录,例如:
{"user_id":30826889,"timestamp":"1664325660","hr":65,"rr":18,"snoring":0} {"user_id":30826889,"timestamp":"1664325720","hr":65,"rr":17,"snoring":0} {"user_id":30826889,"timestamp":"1664325780","hr":70,"rr":15,"snoring":0}
内容的提问来源于stack exchange,提问作者Abul Bashar
相关产品推荐
相关产品推荐

