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

Flutter中xml2Json转换XML后JSON模型解析报vehicleActivity空错误

报错的根本原因是解析过程中Locations.fromJson方法读取VehicleActivity字段失败抛出异常,被你代码中的catch块捕获后直接返回了未赋值的null对象,后续调用该对象的vehicleActivity getter就触发了空指针异常。按以下步骤排查修复:

1. 校验JSON层级匹配

xml2Json转换后的GData格式JSON会保留XML的原始根节点结构,不会直接把VehicleActivity放在根层级。你需要先对照打印的jsonMap结构,确认VehicleActivity的实际层级:

  • 常见的公共交通SIRI接口返回的XML结构层级为:根节点ServiceDelivery → 子节点VehicleMonitoringDelivery → 子节点VehicleActivity
  • 如果你生成模型时给Quicktype的JSON是去掉了根节点的片段,就会出现层级不匹配,需要调整Locations.fromJson的取值路径,示例:
factory Locations.fromJson(Map<String, dynamic> json) => Locations(
    // 替换为你实际jsonMap中的层级路径
    vehicleActivity: List<VehicleActivity>.from(json["ServiceDelivery"]["VehicleMonitoringDelivery"]["VehicleActivity"].map((x) => VehicleActivity.fromJson(x))),
);

2. 补全异常日志定位报错点

你当前的catch块直接吞掉了所有异常,无法定位具体的解析失败位置,修改catch块打印异常信息:

catch(e, stacktrace) {
  print("解析异常内容:$e");
  print("异常调用栈:$stacktrace");
  return locations;
}

通过打印的栈信息可以直接定位到是哪个字段缺失、类型不匹配导致的解析失败。

3. 兼容XML转JSON的数组格式

xml2Json转换时,如果某个节点只有1个实例,会默认转换为Map类型而非List类型,直接调用List.from会触发类型异常,需要做兼容处理:

factory Locations.fromJson(Map<String, dynamic> json) {
  // 替换为你实际层级的VehicleActivity取值
  final activityData = json["ServiceDelivery"]["VehicleMonitoringDelivery"]["VehicleActivity"];
  List<VehicleActivity> activityList = [];
  if (activityData is List) {
    activityList = activityData.map((e) => VehicleActivity.fromJson(e)).toList();
  } else if (activityData is Map<String, dynamic>) {
    activityList.add(VehicleActivity.fromJson(activityData));
  }
  return Locations(vehicleActivity: activityList);
}

4. 所有嵌套字段增加空安全判断

接口返回的XML可能存在字段缺失的情况,所有嵌套对象的解析都要增加空判断,避免空指针:

// 示例:VehicleActivity.fromJson增加空判断
factory VehicleActivity.fromJson(Map<String, dynamic> json) => VehicleActivity(
    recordedAtTime: json["RecordedAtTime"] == null ? null : DateTime.parse(json["RecordedAtTime"]),
    itemIdentifier: json["ItemIdentifier"],
    validUntilTime: json["ValidUntilTime"] == null ? null : DateTime.parse(json["ValidUntilTime"]),
    monitoredVehicleJourney: json["MonitoredVehicleJourney"] == null ? null : MonitoredVehicleJourney.fromJson(json["MonitoredVehicleJourney"]),
    extensions: json["Extensions"] == null ? null : Extensions.fromJson(json["Extensions"]),
);

其他嵌套类比如Extensions、MonitoredVehicleJourney等都要做同样的空判断处理。

内容的提问来源于stack exchange,提问作者al246

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.25 01:36:04