如何在Jolt转换中为message添加对应JSON对象键名?
问题描述
原始JSON结构如下:
{ "error" : { "code" : "validation_failed", "message" : "Validation failed", "fields" : { "date_end" : { "code" : "min_value", "message" : "Value is less than minimum allowed" } } } }
其中date_end可能替换为date_start、name或geo。当前使用的Jolt转换规则为:
[ { "operation": "shift", "spec": { "error": { "fields": { "date_end|date_start|name|geo": { "message": "message" } } } } } ]
现在需要将对应字段的键名(如date_end)添加到提取的message内容前,期望输出:
{ "message": "date_end|Value is less than minimum allowed" }
请问如何修改Jolt转换规则实现该需求?
解决方案
通过三步Jolt操作即可实现需求,修改后的规则如下:
[ // 第一步:捕获字段键名和对应message内容,暂存到临时字段 { "operation": "shift", "spec": { "error": { "fields": { "date_end|date_start|name|geo": { "$": "temp.fieldKey", // 捕获当前匹配的字段键名 "message": "temp.fieldMsg" } } } } }, // 第二步:拼接键名与message内容,生成目标字段 { "operation": "modify-overwrite-beta", "spec": { "message": "=concat(@(1,temp.fieldKey), '|', @(1,temp.fieldMsg))" } }, // 第三步:清理临时字段,只保留最终结果 { "operation": "remove", "spec": ["temp"] } ]
规则说明
- shift操作:用
$符号精准捕获当前匹配到的字段键名(如date_end),存入temp.fieldKey;同时提取对应字段的message内容到temp.fieldMsg。 - modify-overwrite-beta操作:利用Jolt的
concat函数,将字段键名、分隔符|、message内容拼接成新字符串,赋值给最终的message字段。 - remove操作:删除临时存储的
temp对象,确保输出只包含目标message字段。
若需要支持多字段同时报错的场景,可调整规则将结果存入数组,但当前规则完全适配单字段报错的需求。
内容的提问来源于stack exchange,提问作者takotsubo
相关产品推荐
相关产品推荐

