Mule解析固定宽度FlatFile为JSON遇WARDS结构未定义错误求助
固定宽度响应转JSON的错误排查与解决
问题背景
读取服务器返回的固定宽度响应(示例:PQRSBNGL1234567890AAHG),通过给定FFD文件和DataWeave脚本转换为JSON时,报错:java.lang.IllegalStateException - Structure WARDS not defined in schema。
错误原因
- FFD结构歧义:FFD文件定义了两个同级顶级结构(
HOSPITALS和WARDS),但输入的固定宽度字符串总长度(22位)刚好匹配HOSPITALS的结构长度(4+4+10+4=22),FFD解析器仅识别并解析出HOSPITALS结构,WARDS未被加载,导致脚本访问WARDS时提示结构未定义。 - 脚本引用错误:DataWeave脚本错误地尝试访问不存在的
WARDS结构,且单条数据使用map遍历属于冗余操作(map用于数组遍历,单条对象会引发异常)。
修正方案
方案1:输入为单条HOSPITALS数据,需转换为WARDS结构JSON
步骤1:优化FFD文件(可选,消除歧义)
删除多余的WARDS顶级结构,或在Mule连接器配置中指定解析结构为HOSPITALS。调整后的FFD:
values: - name: 'HOSPITALS' values: - name: 'BASIC-INFO' values: - { name: 'NAME', type: String, length: 4 } - { name: 'ADDRESS', type: String, length: 4 } - { name: 'PHONE-NUMBER', type: Integer, length: 10, format: { justify: ZEROES, sign: UNSIGNED } } - { name: 'ADMIN', type: String, length: 4 }
步骤2:修正DataWeave脚本
从解析后的HOSPITALS结构取值,映射到目标Wards结构,移除不必要的map:
output application/json --- { Wards: { "Basic-Info": { Name: payload.HOSPITALS."BASIC-INFO".NAME default "", Address: payload.HOSPITALS."BASIC-INFO".ADDRESS default "", Number: payload.HOSPITALS."BASIC-INFO"."PHONE-NUMBER" default 0, Admin: payload.HOSPITALS."BASIC-INFO".ADMIN default "" } } }
方案2:输入包含多条HOSPITALS/WARDS数据
如果输入是多条固定宽度记录的拼接,需调整FFD为数组结构,并修改脚本适配多类型记录:
调整后的FFD文件
values: - name: 'RECORDS' type: array values: - name: 'HOSPITALS' values: - name: 'BASIC-INFO' values: - { name: 'NAME', type: String, length: 4 } - { name: 'ADDRESS', type: String, length: 4 } - { name: 'PHONE-NUMBER', type: Integer, length: 10, format: { justify: ZEROES, sign: UNSIGNED } } - { name: 'ADMIN', type: String, length: 4 } - name: 'WARDS' values: - name: 'BASIC-INFO' values: - { name: 'NAME', type: String, length: 4 } - { name: 'ADDRESS', type: String, length: 4 } - { name: 'NUMBER', type: Integer, length: 10, format: { justify: ZEROES, sign: UNSIGNED } } - { name: 'ADMIN', type: String, length: 4 }
修正后的DataWeave脚本
遍历数组,根据记录类型映射输出:
output application/json --- payload.RECORDS map (record) -> if (record.HOSPITALS?) { Wards: { "Basic-Info": { Name: record.HOSPITALS."BASIC-INFO".NAME default "", Address: record.HOSPITALS."BASIC-INFO".ADDRESS default "", Number: record.HOSPITALS."BASIC-INFO"."PHONE-NUMBER" default 0, Admin: record.HOSPITALS."BASIC-INFO".ADMIN default "" } } } else if (record.WARDS?) { Wards: { "Basic-Info": { Name: record.WARDS."BASIC-INFO".NAME default "", Address: record.WARDS."BASIC-INFO".ADDRESS default "", Number: record.WARDS."BASIC-INFO".NUMBER default 0, Admin: record.WARDS."BASIC-INFO".ADMIN default "" } } }
内容的提问来源于stack exchange,提问作者Abhinay kumar suraj
相关产品推荐
相关产品推荐

