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

如何用JOLT实现JSON角色标签的提取、排序与结构转换?

JOLT实现按指定规则排序并转换键值对

需求分析

需要从输入的tags列表中筛选出以TAG_ROLE_开头的标签,提取标签值最后一个下划线后的字符串,按该字符串排序后,以role1、role2的格式输出键值对。

正确的JOLT规范

[
  // 1. 筛选目标标签,提取排序键和目标值
  {
    "operation": "shift",
    "spec": {
      "list": {
        "*": {
          "tags": {
            "*": {
              "tag": {
                "TAG_ROLE_*": {
                  "#lastElement(split(@(0), '_'))": "&2.&1.sortKey",
                  "#lastElement(split(@(0), '_'))": "&2.&1.targetValue"
                }
              }
            }
          }
        }
      }
    }
  },
  // 2. 将嵌套结构转为数组,为排序做准备
  {
    "operation": "shift",
    "spec": {
      "*": {
        "*": {
          "@": "roles[]"
        }
      }
    }
  },
  // 3. 按提取的字符串降序排序(若需升序改为"asc")
  {
    "operation": "sort",
    "spec": {
      "roles": {
        "sortBy": ["sortKey"],
        "order": "desc"
      }
    }
  },
  // 4. 从数组中提取目标值,生成带索引的临时键
  {
    "operation": "shift",
    "spec": {
      "roles": {
        "*": {
          "targetValue": "role&1"
        }
      }
    }
  },
  // 5. 将索引从0起始改为1起始,匹配期望的键名格式
  {
    "operation": "shift",
    "spec": {
      "*": {
        "@": "role=toString(toInteger(substring(&, 4)) + 1)"
      }
    }
  }
]

步骤解释

  1. 筛选与提取:通过shift操作定位到tags中的tag字段,用通配符TAG_ROLE_*筛选目标标签;利用lastElement(split(@(0), '_'))拆分标签值并提取最后一个下划线后的内容,分别存入sortKey(用于排序)和targetValue(最终输出值)。
  2. 结构转换:把嵌套的临时结构转为数组roles[],JOLT的sort操作仅支持数组排序,这一步是必要前提。
  3. 排序处理:对roles数组按sortKey字段排序,这里设置为desc(降序)以得到DNS在前、AD在后的结果,若需要升序可改为asc。
  4. 生成临时键:从排序后的数组中提取targetValue,生成以role+数组索引(如role0、role1)为键的结构。
  5. 修正键名索引:通过字符串和数值运算,把索引从0起始改为1起始,最终得到role1、role2的键名格式。

原规范问题说明

你之前的JOLT规范存在两个核心问题:

  • 所有符合TAG_ROLE*的标签都被映射到同一个role1键,后面的标签值会覆盖前面的,最终只能保留最后一个匹配项;
  • 没有做排序和动态编号的处理,无法生成按规则排序的role1、role2结构。

内容的提问来源于stack exchange,提问作者Lucas

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.08 05:55:44