You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

求助: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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.26 02:57:42