Apache NiFi JoltTransformJSON:保留键名中的下划线
嘿,我完全懂你现在的困扰——之前在Apache NiFi里用Jolt做JSON转换时,也踩过类似的“莫名丢下划线”的坑!咱们一步步来排查和解决:
首先得明确一下:你说的是属性"Source"的键名里的下划线丢了,还是**"Source"字段的值**里的下划线不见了?两种场景的解决思路略有不同,我都给你梳理下:
情况1:"Source"键名本身的下划线被移除
比如你原本的输入里有"Source_Field": "value",转换后变成了"SourceField": "value",这大概率是你在Jolt的shift操作里不小心用了会修改键名的规则。
解决方法很简单:在spec里直接用引号明确指定带下划线的键名,不要用任何自动转换键名的逻辑。举个例子:
[ { "operation": "shift", "spec": { "Source_Field": "Source_Field", // 明确映射,原样保留下划线 "*": "&" // 其他字段也原样保留 } } ]
Jolt默认不会主动修改键名的下划线,只要你不额外加键名转换的规则,就能稳稳保留。
情况2:"Source"字段的值里的下划线消失
比如输入里"Source": "USER_ID",转换后变成"Source": "USERID",这十有八九是你的Jolt表达式里加了字符串处理操作,意外把下划线替换掉了。
比如你可能不小心写了这样的modify操作:
[ { "operation": "modify-overwrite-beta", "spec": { "Source": "=replace(@(1,Source), '_', '')" // 这里主动把下划线替换成空了! } } ]
解决方法就是:
- 如果不需要修改Source的值,直接删掉这个
modify操作; - 如果需要做其他字符串处理,调整
replace的正则表达式,比如只替换特定位置的下划线,而不是全部。
给你一个完整的正确示例:
输入JSON:
{ "Source": "USER_ID", "OtherData": "test_value" }
Jolt表达式(完全保留所有下划线):
[ { "operation": "shift", "spec": { "*": "&" // 所有字段原样映射,包括值里的下划线 } } ]
转换后的输出会完美保留所有下划线:
{ "Source": "USER_ID", "OtherData": "test_value" }
核心原则就是:只要你不对Source字段(不管是键名还是值)做任何主动移除下划线的操作,Jolt都会帮你原样保留。如果还是有问题,可以检查下是不是其他转换步骤(比如split、merge)里不小心把下划线当成分隔符了哦!
内容的提问来源于stack exchange,提问作者Lieberta
相关产品推荐
相关产品推荐

