JOLT转换中如何将条件映射的IS_TRUE值转为整数?
解决JOLT条件映射后IS_TRUE转整数的问题
核心原因
带条件的shift操作如果生成的是字符串类型的"1"/"0",后续的modify-overwrite-beta未生效,通常是以下原因:
- shift操作中错误生成了带引号的字符串值(比如
#"1"),且modify操作的顺序或写法有误 - 后续操作覆盖了modify转换后的结果
可行解决方案
方案1:在条件映射时直接生成整数(推荐)
不需要后续转换操作,直接在shift的条件分支中生成整数类型的值,避免字符串转整数的步骤:
假设输入JSON:
{ "status": "ACTIVE" }
调整后的JOLT规格:
[ { "operation": "shift", "spec": { "status": { "ACTIVE": { "#1": "IS_TRUE" // 直接生成整数1,而非字符串"1" }, "*": { "#0": "IS_TRUE" // 直接生成整数0 } } } } ]
输出结果:
{ "IS_TRUE": 1 }
方案2:确保modify操作正确作用于条件生成的字符串
如果必须先生成字符串再转换,需保证modify-overwrite-beta操作在shift之后,且使用正确的类型转换写法:
JOLT规格示例:
[ { "operation": "shift", "spec": { "status": { "ACTIVE": { "#\"1\"": "IS_TRUE" }, "*": { "#\"0\"": "IS_TRUE" } } } }, { "operation": "modify-overwrite-beta", "spec": { "IS_TRUE": "=toInteger" // 将字符串"1"/"0"转换为整数 } } ]
注意:
- 必须保证modify操作在shift之后执行,否则无法捕获到生成的IS_TRUE字段
- 如果IS_TRUE字段可能不存在,可以添加默认值处理:
"IS_TRUE": ["=toInteger", "@(1,IS_TRUE)", 0]
方案3:使用modify-beta结合条件判断
如果需要在modify操作中直接完成条件判断+类型转换,也可以这样写:
假设输入JSON:
{ "flag": "Y" }
JOLT规格:
[ { "operation": "modify-overwrite-beta", "spec": { "IS_TRUE": ["=equals(@(1,flag), 'Y')", 1, 0] } } ]
这里利用=equals函数做条件判断,直接返回整数1或0,一步完成逻辑。
验证要点
- 检查操作顺序:shift(条件映射)必须在modify(类型转换)之前
- 检查shift中生成的值:如果是
#1则是整数,#"1"是字符串,按需选择 - 避免后续操作覆盖IS_TRUE字段:确保modify之后没有其他会修改该字段的shift或modify操作
内容的提问来源于stack exchange,提问作者user3691240
相关产品推荐
相关产品推荐

