JSONata实现特定JSON格式转换的技术咨询
JSONata转换方案:适配Telegraf输出的code_tag格式键处理
核心JSONata表达式
直接使用以下表达式即可完成转换,适配所有codeX_xxx格式的键:
( $grouped := $groupBy($keys(data), function($k) { $split($k, "_")[0] }), { "data": $merge( $map($keys($grouped), function($code) { $count($grouped[$code]) > 1 ? { $code: $merge( $map($grouped[$code], function($key) { { $split($key, "_")[1]: data[$key] } }) ) } : {} }) ), **$merge( $map($keys($grouped), function($code) { $count($grouped[$code]) = 1 ? { $code: data[$grouped[$code][0]] } : {} }) )** } )
逻辑说明
- 分组处理:通过
$groupBy将data内的键按下划线分割后的前缀分组(如code1_value和code1_target归为code1组)。 - 构建嵌套结构:遍历分组,若分组内键数量大于1(存在后缀),则将每个键的后缀作为子对象的键,对应值作为子对象的值,合并到
data的对应前缀字段下。 - 保留顶级字段:若分组内仅单个键(无后缀,如
code2),则直接将该键值对放到顶级对象中。
Telegraf配置示例
将上述表达式配置到Telegraf的outputs插件的jsonata_filter选项中,注意用三重单引号包裹多行表达式:
[[outputs.influxdb_v2]] urls = ["http://localhost:8086"] token = "your-auth-token" organization = "your-org-name" bucket = "your-bucket-name" jsonata_filter = ''' ( $grouped := $groupBy($keys(data), function($k) { $split($k, "_")[0] }), { "data": $merge( $map($keys($grouped), function($code) { $count($grouped[$code]) > 1 ? { $code: $merge( $map($grouped[$code], function($key) { { $split($key, "_")[1]: data[$key] } }) ) } : {} }) ), **$merge( $map($keys($grouped), function($code) { $count($grouped[$code]) = 1 ? { $code: data[$grouped[$code][0]] } : {} }) )** } ) '''
验证效果
将原结构代入表达式后,输出结果与目标结构完全一致,且支持任意数量的codeX_xxx格式键和单独codeX键。
内容的提问来源于stack exchange,提问作者chococroqueta
相关产品推荐
相关产品推荐

