使用Pentaho Data Integration将多层父级JSON转数据库表报错求助
Pentaho Data Integration (PDI) 嵌套JSON转数据库表排障方案
问题场景
API返回如下嵌套JSON结构,使用PDI构建转换加载到指定数据库表时运行报错:
{ "report": { "accounts": [ { "subheader": "(1-10005)", "beginning_balance": { "date": "29/12/2022", "balance": 0 }, "content": [ { "transaction": { "date": "31/12/2022", "transaction_type": "Bank Deposit", "number": "10002", "description": "description 1", "debit": " 1.000.000,00", "credit": " 0,00", "balance": " 1.000.000,00" } }, { "transaction": { "date": "31/12/2022", "transaction_type": "Bank Withdrawal", "number": "10002", "description": "description 2", "debit": " 0,00", "credit": " 300.000,00", "balance": " 700.000,00" } } ] } ] } }
核心排查与解决步骤
1. 修正JSON Input组件路径配置
PDI解析嵌套JSON必须精准设置JSON路径表达式:
- 提取
accounts数组:路径设为$.report.accounts,启用Repeat选项遍历每个账户 - 提取账户基础字段:
subheader路径$.subheader,beginning_balance.date路径$.beginning_balance.date,beginning_balance.balance路径$.beginning_balance.balance - 遍历交易数据:路径设为
$.content[*].transaction,启用Repeat选项获取每笔交易的所有字段 - 注意:路径需严格遵循JSONPath规范,避免层级或索引拼写错误
2. 处理数值格式适配
JSON中debit/credit/balance为带千分点、逗号小数的字符串,直接写入数值型字段会报错,需两步转换:
- 添加
Replace in string组件:先替换千分点.为空,搜索值填\.,勾选Regular expression,替换值留空 - 再次使用
Replace in string:替换小数逗号,为. - 最后用
Convert Fields组件将转换后的字符串转为Number类型(对应数据库DECIMAL/NUMERIC类型)
3. 匹配数据库字段类型与映射
- 日期字段:数据库表设为DATE/DATETIME类型,PDI中用
Convert Fields将DD/MM/YYYY格式的字符串转为日期类型,指定格式为dd/MM/yyyy - 数值字段:设置足够精度(如DECIMAL(12,2)),避免溢出
- 字段映射:确认PDI输出字段名与数据库表字段名完全一致,注意大小写敏感问题
4. 验证数据流每一步结果
- 用PDI的Preview功能逐组件检查:
- 预览
JSON Input是否正确提取所有嵌套字段,无缺失或空值 - 预览格式转换后的数值是否符合数据库要求
- 预览
Table Output组件的字段映射是否完全匹配
- 预览
5. 常见错误快速定位
- JSON路径错误:报错提示"无法找到指定路径",重新核对路径层级与数组索引
- 类型转换失败:报错提示"数值转换异常",检查格式转换组件的配置是否正确
- 数据库写入失败:报错提示"权限不足"或"字段不兼容",确认数据库连接权限、字段类型匹配度
内容的提问来源于stack exchange,提问作者Doni Ramdani
相关产品推荐
相关产品推荐

