JOLT转换求助:替换日期字段的/为-失败,modify-overwrite-beta失效
问题解决:Jolt转换中replace逻辑失效及结构调整修正
问题分析
你的Jolt Spec存在两个核心问题:
- Shift阶段冗余字段残留:
"*": "certificates[&3].&"会把mapping里的date字段也复制到certificates对象下,导致最终结果多出date字段,同时后续单独映射date到validity的逻辑被提前的通配符覆盖,影响后续修改操作。 - Modify阶段未处理null值:当
validity为null时,replace函数无法正常执行,导致转换失败或结果不符合预期。
修正后的Jolt Spec
[ { "operation": "shift", "spec": { "certificates": { "*": { "name": "certificates[&1].name", "description": "certificates[&1].description", "mapping": { "*": { // 映射mapping中除date外的所有字段到certificates对象 "code": "certificates[&3].code", "rating": "certificates[&3].rating", "scope": "certificates[&3].scope", // 将date重命名为validity "date": "certificates[&3].validity" } } } } } }, { "operation": "default", "spec": { "code": "ABC1" } }, { "operation": "modify-overwrite-beta", "spec": { "certificates": { "*": { // 仅当validity不为null时执行替换,否则保留null "validity": ["=notNull", "=replace(@(1,validity), '/', '-')"] } } } } ]
关键修正点说明
Shift操作优化:
- 移除通配符
*的全局映射,改为明确指定mapping内需要保留的字段(code/rating/scope),避免冗余字段生成。 - 单独将
date映射为validity,确保字段重命名逻辑生效。
- 移除通配符
Modify操作修复:
- 使用
["=notNull", "=replace(...)"]的条件逻辑,先判断validity是否为非空值,仅在非空时执行replace替换/为-,空值则直接保留null。
- 使用
顶层code字段:
- 保留
default操作设置顶层code为ABC1,符合需求。
- 保留
测试结果
将修正后的Spec应用于输入JSON,可得到你期望的输出结果:
{ "certificates": [ { "name": "name1", "description": "description1", "validity": "DEC-2023", "code": "ABC1", "rating": null, "scope": [ "scope1", "scope2", "scope3" ] }, { "name": "name2", "description": "description2", "validity": null, "code": "ABC1", "rating": null, "scope": [ "TBD" ] } ], "code": "ABC1" }
内容的提问来源于stack exchange,提问作者pramod wadappi
相关产品推荐
相关产品推荐

