
本文介绍一种可靠的 JOLT 转换方案,通过组合 shift、modify-overwrite-beta 和 cardinality 三阶段操作,精准提取每个字段值中位于第一个冒号 : 之后、首个逗号 , 之前的子串(含后续逗号逻辑处理),适用于任意数量键的批量处理。
本文介绍一种可靠的 jolt 转换方案,通过组合 `shift`、`modify-overwrite-beta` 和 `cardinality` 三阶段操作,精准提取每个字段值中位于第一个冒号 `:` 之后、首个逗号 `,` 之前的子串(含后续逗号逻辑处理),适用于任意数量键的批量处理。
在处理结构化 JSON 数据时,常需对多个字段的字符串值执行统一的文本截取逻辑。本例要求:对输入 JSON 中所有键对应的字符串值,提取其第一个 : 之后、第一个 , 之前(含该逗号)的内容——注意目标并非简单“取到第一个逗号为止”,而是保留 : 后直到首个逗号及其后全部内容中的首段非空子串(如 "ppp:qqq,rrr," → "qqq,";"111:222," → "222";"aaa:bbb," → "bbb")。这需要兼顾模式匹配与边界控制。
核心难点在于:原 shift 操作无法动态绑定键名,且正则式匹配能力有限。解决方案采用三步流水线:
shift 阶段:动态捕获并映射键名
利用通配符 * 匹配任意键(如 "key1"),再用嵌套通配 *:*:, 匹配形如 "X:Y," 或 "X:Y,Z..." 的值(注意末尾逗号是关键锚点)。&2 表示将原始键名(第二层上下文)作为输出键,@|$(0,2) 表示优先取匹配组第2部分(即 : 后、, 前的内容),若不匹配则回退取整个值。此步实现键名透传与主体子串提取。modify-overwrite-beta 阶段:按逗号切分并取首项
对每个字段值执行 =split(',', @(1,&)):@(1,&) 引用当前键的原始值(如 "qqq,rrr"),split 将其转为数组 ["qqq","rrr"],JOLT 自动取数组首元素 "qqq"(后续 cardinality 会确保单值)。cardinality 阶段:强制单值化
因 split 可能返回单元素数组(如 "222" → ["222"]),而目标输出为字符串,"ONE" 策略将数组自动展开为首元素,统一输出格式。
完整 JOLT Spec 如下:
[
{
"operation": "shift",
"spec": {
"*": {
"*:*,": {
"@|$(0,2)": "&2"
}
}
}
},
{
"operation": "modify-overwrite-beta",
"spec": {
"*": "=split(',',@(1,&))"
}
},
{
"operation": "cardinality",
"spec": {
"*": "ONE"
}
}
]
✅ 注意事项:
- 输入值必须包含至少一个 : 和一个 , 才能被 *:*:, 模式捕获;若存在无逗号的值(如 "xxx:yyy"),需扩展 shift 的匹配分支(例如添加 "*:*": { "$(0,2)": "&2" })。
- modify-overwrite-beta 属于 JOLT 高级操作,需确保运行环境支持(推荐 JOLT 0.1.1+)。
- 该方案天然支持任意键名(key1/key2/customField),无需硬编码,真正实现全量键遍历处理。
通过此三阶段设计,既规避了单次 shift 的键名固化缺陷,又以声明式方式完成字符串解析,是 JOLT 处理动态键文本提取的典型范式。











