使用Jolt transformer无法将序列化JSON对象数组转为目标JSON对象
解决方案
首先处理两个前置问题:
- 你提供的输入
sales对应的字符串内部JSON对象之间缺失逗号,属于非法JSON格式,需要先修正为合法格式:"[{\"Option\":\"Britania\",\"value\":\"200\"},{\"Option\":\"Parle\",\"value\":\"100\"},{\"Option\":\"mariegold\",\"value\":\"500\"},{\"Option\":\"snacks\",\"value\":\"200\"}]" - 你期望输出里的
cadbury、固定value为0这类自定义映射规则,需要在转换逻辑里单独配置
完整Jolt配置
[ // 第一步:把sales的字符串反序列化为真实JSON数组 { "operation": "modify-overwrite-beta", "spec": { "sales": "=parseJson(@(1,sales))", "CREATIONDATETIME": "=substring(@(1,CREATIONDATETIME),0,19)" } }, // 第二步:遍历数组映射为需要的option+序号、value+序号结构 { "operation": "shift", "spec": { "sales": { "*": { // 数组索引从0开始,自动加1生成序号后缀 "Option": "sales.option&(0,2)", // 需保留原始value就替换为@(1,value),固定为0就用当前配置 "#0": "sales.value&(0,2)" } }, "status": { "SUBMITTED": { "#submitted": "key6" } } } }, // 第三步:补充自定义固定字段,比如期望输出里的option2=cadbury { "operation": "modify-default-beta", "spec": { "sales": { "option2": "cadbury", "value2": "0" }, "key6": "pending" } } ]
核心逻辑说明
- 最关键的一步是用
=parseJson函数把序列化的JSON字符串转成Jolt可操作的数组结构,之前的配置没有做反序列化,无法处理字符串内部的内容 - 遍历数组时用
&(0,2)取上层数组的索引值,自动生成option、value的序号后缀 - 如果只需要保留数组前3项,把遍历规则里的通配符
*替换为0、1、2三个明确索引即可 - 原有配置里的CREATIONDATETIME处理、key6赋值逻辑也保留兼容了
内容的提问来源于stack exchange,提问作者DHANANJAY RAGHAV
相关产品推荐
相关产品推荐

