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

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>'

错误原因

  1. Product.fromJson赋值逻辑错误:
    原代码中判断media != null是检查当前实例的media属性(此时还未赋值,默认是null),而非JSON中的media字段是否存在。同时没有将映射后的列表赋值给media变量,导致media始终为null。
  2. 多余的重复解析:
    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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.12 14:20:37