借助JOLT完成嵌套时序JSON扁平化转换的问题求助
JOLT实现多层嵌套时序JSON打平的实现方案
核心问题说明
- 待处理输入为三层嵌套结构:最外层键为ISO格式时间戳,中间层键为设备ID(如249184、249185),最内层存储SRAD、T两类监测指标的数值
- 目标输出为打平后的独立时序记录列表,每条记录包含
timestamp、deviceID、SRAD、T四个字段,实现外层时间戳与下属所有设备节点的全匹配展开 - 常规固定键的转换规则无法适配动态嵌套的键名结构,容易出现值错位、记录合并错误的问题
输入输出结构示例
输入样例
{ "2024-05-20T12:00:00Z": { "249184": { "SRAD": 320, "T": 24.5 }, "249185": { "SRAD": 298, "T": 23.8 } }, "2024-05-20T12:05:00Z": { "249184": { "SRAD": 325, "T": 24.7 } } }
期望输出样例
[ { "timestamp": "2024-05-20T12:00:00Z", "deviceID": "249184", "SRAD": 320, "T": 24.5 }, { "timestamp": "2024-05-20T12:00:00Z", "deviceID": "249185", "SRAD": 298, "T": 23.8 }, { "timestamp": "2024-05-20T12:05:00Z", "deviceID": "249184", "SRAD": 325, "T": 24.7 } ]
可直接复用的JOLT转换规则
[ { "operation": "shift", "spec": { // 匹配最外层所有ISO时间戳节点 "*": { // 匹配时间戳下所有设备ID节点 "*": { // 透传设备节点下的固定指标值 "SRAD": "[&1].SRAD", "T": "[&1].T", // 捕获当前层级的设备ID键名,写入对应记录的deviceID字段 "$": "[&2].deviceID", // 向上回溯1层获取时间戳节点的键名,写入对应记录的timestamp字段 "@(1,$)": "[&2].timestamp" } } } } ]
规则适配逻辑
- 全程使用通配符匹配动态键名,无需为单时间戳、单设备的固定场景硬编码规则,可兼容任意数量的时间戳、任意数量的设备ID嵌套场景
- 通过JOLT内置的层级引用语法实现键名捕获,避免值与字段错位问题:
&用于回溯通配符的匹配层级,为每个独立设备节点分配数组中的独立索引位,防止多设备记录合并$用于获取当前匹配节点的键名,而非节点存储的数值@(层级,$)用于向上回溯指定层级的节点键名,实现外层时间戳向内层设备记录的字段传递
内容的提问来源于stack exchange,提问作者Tokolosk
相关产品推荐
相关产品推荐

