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
相关产品推荐
相关产品推荐

