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

Flutter中JSON字符串转List<String>类型不匹配报错的解决方法

问题修复方案

报错原因

你的JSON返回数据中,ingredientes、id_dia_da_semana、id_categoria都是字符串类型,但Meal类里对应的ingredients、idDiaSem、idCategory是List类型,直接用as List<String>强制类型转换必然失败——String和List是完全不同的类型体系。

下面给出两种针对性修复方案,可根据实际业务需求选择:


方案一:把单个字符串包装成单元素列表

如果业务逻辑要求这三个字段必须是列表(比如id_dia_da_semana: "seg"需要转成["seg"]),修改Meal.fromMap方法:

factory Meal.fromMap(Map<String, dynamic> map) {
  return Meal(
    id: map['id'] as String,
    descricao: map['nome'] as String,
    // 将单个字符串转为单元素列表
    ingredients: [map['ingredientes'] as String],
    idDiaSem: [map['id_dia_da_semana'] as String],
    idCategory: [map['id_categoria'] as String],
    imageUrl: map['url_da_imagem'] as String,
  );
}

如果担心后端可能返回null值,可增加空安全判断:

ingredients: map['ingredientes'] != null ? [map['ingredientes'] as String] : [],
idDiaSem: map['id_dia_da_semana'] != null ? [map['id_dia_da_semana'] as String] : [],
idCategory: map['id_categoria'] != null ? [map['id_categoria'] as String] : [],

方案二:修改Meal类的属性类型

如果业务上这三个字段原本就不需要是列表,只是定义类时出错了,直接把对应属性改成String类型:

class Meal {
  final String id;
  final String descricao;
  final String ingredients; // 改为String
  final String idDiaSem;    // 改为String
  final String idCategory;  // 改为String
  final String imageUrl;

  const Meal({
    required this.id,
    required this.descricao,
    required this.ingredients,
    required this.idDiaSem,
    required this.idCategory,
    required this.imageUrl,
  });

  Map<String, dynamic> toMap() {
    return <String, dynamic>{
      'id': id,
      'nome': descricao,
      'ingredientes': ingredients,
      'id_dia_da_semana': idDiaSem,
      'id_categoria': idCategory,
      'url_da_imagem': imageUrl,
    };
  }

  factory Meal.fromMap(Map<String, dynamic> map) {
    return Meal(
      id: map['id'] as String,
      descricao: map['nome'] as String,
      ingredients: map['ingredientes'] as String,
      idDiaSem: map['id_dia_da_semana'] as String,
      idCategory: map['id_categoria'] as String,
      imageUrl: map['url_da_imagem'] as String,
    );
  }

  String toJson() => json.encode(toMap());

  factory Meal.fromJson(String source) =>
      Meal.fromMap(json.decode(source) as Map<String, dynamic>);
}

兼容方案:同时支持字符串和列表格式

如果后端未来可能把这些字段改成数组格式(比如id_dia_da_semana: ["seg", "ter"]),可以写一个兼容方法,同时处理String和List两种情况:

factory Meal.fromMap(Map<String, dynamic> map) {
  // 封装统一的转换逻辑
  List<String> parseToList(dynamic value) {
    if (value is List) {
      return value.cast<String>();
    } else if (value is String) {
      return [value];
    }
    return [];
  }

  return Meal(
    id: map['id'] as String,
    descricao: map['nome'] as String,
    ingredients: parseToList(map['ingredientes']),
    idDiaSem: parseToList(map['id_dia_da_semana']),
    idCategory: parseToList(map['id_categoria']),
    imageUrl: map['url_da_imagem'] as String,
  );
}

内容的提问来源于stack exchange,提问作者pedro.curti

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.21 23:30:48