求助:DataWeave实现insuranceContractLayer嵌套对象扁平化
DataWeave 嵌套对象扁平化解决方案
需求说明
把JSON输入里insuranceContractLayer数组内的嵌套对象扁平化,扁平化后的键采用「前缀__原键」的格式。
示例输入
{ "policyNumber": "POL123", "insuranceContractLayer": [ { "layerId": "L001", "coverage": { "type": "PROPERTY", "limit": 100000 }, "deductible": { "amount": 500, "type": "FIXED" } }, { "layerId": "L002", "coverage": { "type": "LIABILITY", "limit": 200000 } } ] }
期望输出
{ "policyNumber": "POL123", "insuranceContractLayer": [ { "layerId": "L001", "coverage__type": "PROPERTY", "coverage__limit": 100000, "deductible__amount": 500, "deductible__type": "FIXED" }, { "layerId": "L002", "coverage__type": "LIABILITY", "coverage__limit": 200000 } ] }
可用实现代码
%dw 2.0 output application/json // 通用扁平化函数:给嵌套键自动添加前缀 fun flattenWithPrefix(obj: Object, prefix: String = "") = obj flatMap ((value, key) -> if (value is Object) flattenWithPrefix(value, if (prefix == "") key else prefix ++ "__" ++ key) else {(if (prefix == "") key else prefix ++ "__" ++ key): value} ) // 主逻辑:遍历insuranceContractLayer数组,扁平化每个元素 --- payload update { case layers at .insuranceContractLayer -> layers map (item) -> flattenWithPrefix(item) }
之前错误的原因与解决
1. 自定义flatten函数语法错误
通常是因为函数写法不符合DataWeave规范:
- 参数类型声明错误,或者函数体内的分支结构语法有误
- 使用
flatMap处理对象键值对时,未正确返回合法的键值对结构
解决:严格遵循DataWeave 2.0函数定义规则,参考上面的flattenWithPrefix写法,确保每个分支返回带括号包裹的键值对结构。
2. 硬编码时的「Cannot coerce Number (1) to Object」错误
这个错误是因为硬编码过程中,把非对象类型(比如数字、字符串)当成对象来操作了。比如错误地对数字类型的字段使用map等对象专属操作,导致类型转换失败。
解决:添加类型判断(value is Object),仅对对象类型的字段进行递归扁平化处理,普通值直接生成带前缀的键值对即可。
额外说明
- 该函数支持多层嵌套对象的扁平化,比如遇到
coverage.detail.amount这类深层嵌套,会自动生成coverage__detail__amount格式的键 - 如果仅需要处理一层嵌套,可以简化函数逻辑,但通用写法的适用性更强
内容的提问来源于stack exchange,提问作者Devendra Verma
相关产品推荐
相关产品推荐

