Flutter嵌套JSON解析报错:‘Media’无法赋值给‘Map<String, dynamic>’参数
Dart嵌套JSON解析:Media列表空值处理与映射错误修复
问题场景
解析嵌套JSON时,Product模型中的Media列表设计为可空类型,但当前代码存在两个问题:
- 无法正确处理
media字段的空值检查 - 执行以下代码时触发类型错误:
错误提示:final media = productItem.media!.map((e) => Media.fromJson(e)).toList();The argument type 'Media' can't be assigned to the parameter type 'Map<String, dynamic>'
错误原因
- Product.fromJson赋值逻辑错误:
原代码中判断media != null是检查当前实例的media属性(此时还未赋值,默认是null),而非JSON中的media字段是否存在。同时没有将映射后的列表赋值给media变量,导致media始终为null。 - 多余的重复解析:
productItem.media已经是List<Media>?类型,直接调用map时,e是Media实例,而Media.fromJson需要的是Map<String, dynamic>类型,因此触发类型不匹配错误。
修复方案
1. 修正Product.fromJson的media字段解析
检查JSON中的media字段是否存在且不为空,再将其映射为List<Media>并赋值给media:
Product.fromJson(Map<String, dynamic> json){ id = json['id']; name = json['name']; categoryName = json['category_name']; // 检查JSON中的media字段是否存在且不为空 if (json.containsKey('media') && json['media'] != null) { media = (json['media'] as List).map((item) => Media.fromJson(item)).toList(); } else { media = null; } }
2. 移除错误的重复解析代码
直接使用已解析完成的media列表,无需再次调用Media.fromJson:
// 错误写法 // final media = productItem.media!.map((e) => Media.fromJson(e)).toList(); // 正确写法 final media = productItem.media; // 直接获取List<Media>?类型 // 如果需要非空列表,可使用空合并运算符 final nonNullMedia = productItem.media ?? [];
3. 优化toJson方法的空值安全
避免media为null时调用!导致崩溃,添加空值判断:
Map<String, dynamic> toJson() { final data = <String, dynamic>{}; data['id'] = id; data['name'] = name; data['category_name'] = categoryName; // 空值处理:仅当media不为null时添加到JSON if (media != null) { data['media'] = media!.map((e)=>e.toJson()).toList(); } return data; }
完整修复代码
补充Links模型(原代码中未给出,需配套实现):
class Links { Links({required this.url}); late final String url; Links.fromJson(Map<String, dynamic> json){ url = json['url']; // 根据实际JSON结构补充其他字段 } Map<String, dynamic> toJson() { final data = <String, dynamic>{}; data['url'] = url; return data; } } class Product { Product({ required this.id, required this.name, required this.categoryName, this.media, }); late final int id; late final String name; late final String categoryName; List<Media>? media; Product.fromJson(Map<String, dynamic> json){ id = json['id']; name = json['name']; categoryName = json['category_name']; if (json.containsKey('media') && json['media'] != null) { media = (json['media'] as List).map((item) => Media.fromJson(item)).toList(); } else { media = null; } } Map<String, dynamic> toJson() { final data = <String, dynamic>{}; data['id'] = id; data['name'] = name; data['category_name'] = categoryName; if (media != null) { data['media'] = media!.map((e)=>e.toJson()).toList(); } return data; } } class Media { Media({ required this.id, required this.productId, required this.type, required this.links, }); late final int id; late final int productId; late final String type; late final Links links; Media.fromJson(Map<String, dynamic> json){ id = json['id']; productId = json['product_id']; type = json['type']; links = Links.fromJson(json['links']); } Map<String, dynamic> toJson() { final _data = <String, dynamic>{}; _data['id'] = id; _data['product_id'] = productId; _data['type'] = type; _data['links'] = links.toJson(); return _data; } }
内容的提问来源于stack exchange,提问作者st4tic
相关产品推荐
相关产品推荐

