Flutter中JSON字符串转List<String>类型不匹配报错的解决方法
问题修复方案
报错原因
你的JSON返回数据中,ingredientes、id_dia_da_semana、id_categoria都是字符串类型,但Meal类里对应的ingredients、idDiaSem、idCategory是Listas 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
相关产品推荐
相关产品推荐

