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

Mule解析固定宽度FlatFile为JSON遇WARDS结构未定义错误求助

固定宽度响应转JSON的错误排查与解决

问题背景

读取服务器返回的固定宽度响应(示例:PQRSBNGL1234567890AAHG),通过给定FFD文件和DataWeave脚本转换为JSON时,报错:java.lang.IllegalStateException - Structure WARDS not defined in schema。

错误原因

  1. FFD结构歧义:FFD文件定义了两个同级顶级结构(HOSPITALS和WARDS),但输入的固定宽度字符串总长度(22位)刚好匹配HOSPITALS的结构长度(4+4+10+4=22),FFD解析器仅识别并解析出HOSPITALS结构,WARDS未被加载,导致脚本访问WARDS时提示结构未定义。
  2. 脚本引用错误: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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.16 03:27:03