JOLT Spec后续问询:将指定标签转换为目标键值对结构
JOLT转换方案:过滤指定标签并重构键值对结构
以下是针对需求的完整JOLT转换方案,实现过滤TAG_VM、TAG_HOST标签,并将剩余标签转换为指定键值对结构:
输入JSON
{ "list": [ { "tags": [ { "scope": "", "tag": "TAG_VM" }, { "scope": "", "tag": "TAG_HOST" }, { "scope": "", "tag": "TAG_ROLE_DNS" }, { "scope": "", "tag": "TAG_ROLE_AD" }, { "scope": "", "tag": "TAG_USER_INSIDE" }, { "scope": "", "tag": "TAG_USER_OUTSIDE" },{ "scope": "", "tag": "TAG_INTERNET_TRUE" } ] } ], "result_count": 1, "sort_by": "name" }
期望输出
{ "role1" : "DNS", "role2" : "AD", "user1" : "INSIDE", "user2" : "OUTSIDE", "internet" : "TRUE" }
JOLT转换规格
[ // 过滤掉TAG_VM和TAG_HOST,保留其余标签到filtered_tags数组 { "operation": "shift", "spec": { "list": { "*": { "tags": { "*": { "tag": { "TAG_VM": null, "TAG_HOST": null, "*": { "@(2)": "filtered_tags[]" } } } } } } } }, // 拆分tag字符串为数组,方便提取类型和值 { "operation": "modify-overwrite-beta", "spec": { "filtered_tags": { "*": { "tag": "=split('_', @(1,tag))" } } } }, // 按类型分组,生成带序号的键名 { "operation": "shift", "spec": { "filtered_tags": { "*": { "tag": { "2": { "*": { "@(3,tag[3])": "&1&(4,count(&1))" } } } } } } }, // 将所有键名转为小写 { "operation": "modify-overwrite-beta", "spec": { "*": "=toLower(@(1))" } }, // 处理internet的特殊情况,去掉序号 { "operation": "shift", "spec": { "internet1": "internet", "*": "&" } } ]
转换步骤说明
- 标签过滤:通过
shift操作直接丢弃不需要的标签,把符合条件的标签收集到filtered_tags数组中。 - 字符串拆分:利用
split('_')把每个标签拆分成数组,比如TAG_ROLE_DNS会被拆成["TAG","ROLE","DNS"],方便后续提取类型和具体值。 - 键名生成:根据拆分后的类型字段(比如ROLE、USER),用
count(&1)统计同类型标签的数量,自动生成带序号的键名(如role1、user2),同时把对应的值提取出来。 - 格式调整:先把所有键名转为小写,再单独将
internet1重命名为internet,完全匹配期望的输出格式。
内容的提问来源于stack exchange,提问作者Lucas
相关产品推荐
相关产品推荐

