如何用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)" } } } ]
步骤解释
- 筛选与提取:通过
shift操作定位到tags中的tag字段,用通配符TAG_ROLE_*筛选目标标签;利用lastElement(split(@(0), '_'))拆分标签值并提取最后一个下划线后的内容,分别存入sortKey(用于排序)和targetValue(最终输出值)。 - 结构转换:把嵌套的临时结构转为数组
roles[],JOLT的sort操作仅支持数组排序,这一步是必要前提。 - 排序处理:对
roles数组按sortKey字段排序,这里设置为desc(降序)以得到DNS在前、AD在后的结果,若需要升序可改为asc。 - 生成临时键:从排序后的数组中提取
targetValue,生成以role+数组索引(如role0、role1)为键的结构。 - 修正键名索引:通过字符串和数值运算,把索引从0起始改为1起始,最终得到
role1、role2的键名格式。
原规范问题说明
你之前的JOLT规范存在两个核心问题:
- 所有符合
TAG_ROLE*的标签都被映射到同一个role1键,后面的标签值会覆盖前面的,最终只能保留最后一个匹配项; - 没有做排序和动态编号的处理,无法生成按规则排序的
role1、role2结构。
内容的提问来源于stack exchange,提问作者Lucas
相关产品推荐
相关产品推荐

