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

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]] } : {}
      })
    )**
  }
)

逻辑说明

  1. 分组处理:通过$groupBy将data内的键按下划线分割后的前缀分组(如code1_value和code1_target归为code1组)。
  2. 构建嵌套结构:遍历分组,若分组内键数量大于1(存在后缀),则将每个键的后缀作为子对象的键,对应值作为子对象的值,合并到data的对应前缀字段下。
  3. 保留顶级字段:若分组内仅单个键(无后缀,如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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.09 16:33:36