如何使用JOLT规范从JSON多字段值中提取指定子串?
问题:调整JOLT规范实现批量提取字符串子串
需求场景
需要对输入JSON的所有字段值,提取冒号与逗号之间的目标子串,实现如下转换效果:
输入JSON
{ "key1": "ppp:qqq,rrr,", "key2": "111:222,", "key3": "aaa:bbb," }
期望输出JSON
{ "key1": "qqq,", "key2": "222", "key3": "bbb" }
当前问题
现有JOLT规范仅能处理key1单个字段,且输出结果不符合预期:
当前使用的JOLT规范
[ { "operation": "shift", "spec": { "*": { "*:*,*": { "$(0,2)": "key1" } } } } ]
当前输出结果
{ "key1": "qqq" }
修正后的JOLT规范
[ // 第一步:提取每个字段值中冒号之后的部分 { "operation": "modify-overwrite-beta", "spec": { "*": "=substringAfter(@, ':')" } }, // 第二步:根据内容结构提取目标子串,同时保留原字段名 { "operation": "shift", "spec": { "*": { // 匹配包含多个逗号的内容(如"qqq,rrr,"),提取第一个逗号及之前的部分并保留逗号 "*:*": { "$(0,1),": "&2" }, // 匹配仅含单个末尾逗号的内容(如"222,"、"bbb,"),提取逗号之前的部分 "*": { "$(0,1)": "&2" } } } } ]
逻辑说明
- modify-overwrite-beta 阶段:通过
substringAfter函数剥离每个字段值中冒号前面的内容,比如key1的值从ppp:qqq,rrr,变为qqq,rrr,。 - shift 阶段:
- 针对包含多个逗号的字符串(如
qqq,rrr,),通过*:*匹配规则,提取第一个逗号前的内容并拼接逗号,得到qqq,。 - 针对仅含末尾逗号的字符串(如
222,),通过*匹配规则,提取逗号前的纯内容,得到222。 &2用于引用二级父节点的字段名(即原有的key1、key2、key3),确保输出的键名与输入一致。
- 针对包含多个逗号的字符串(如
内容的提问来源于stack exchange,提问作者tmanral
相关产品推荐
相关产品推荐

