存储到本地数据库前将JSON转为对象的正确方法?解决类型转换报错
解决JSON转对象存入本地数据库时的类型不匹配问题
从你遇到的错误 type '_InternalLinkedHashMap<String, dynamic>' is not a subtype of type 'String' 来看,问题出在数据转换的步骤上,咱们一步步拆解:
错误原因
你提到 i['created_by_user'] 的输出是 {id: 3, name: A},这说明它本身已经是一个 Map<String, dynamic> 类型的对象了,而不是JSON字符串。但你当前的处理逻辑里,既多余地用了 jsonDecode(它是用来把JSON字符串转成Map的),又可能在存入数据库时没有正确转成 CreatedBy 对象,导致直接把Map传给了期望接收String的转换器。
解决方案
1. 修正CreatedBy对象的转换步骤
既然i['created_by_user']已经是Map,直接用它来生成CreatedBy对象即可,不需要额外的jsonDecode:
// 错误写法:多了一层jsonDecode,因为i['created_by_user']不是字符串 // CreatedBy.fromJson(jsonDecode(i['created_by_user'])) // 正确写法:直接用已有Map生成对象 CreatedBy createdBy = CreatedBy.fromJson(i['created_by_user']);
2. 确保数据库字段接收的是CreatedBy对象
当你往本地数据库插入数据时,要把上面生成的createdBy对象赋值给createdByUser字段,而不是直接传入原始的Map。你的CreatedBySqlConverter会自动完成CreatedBy对象到JSON字符串的转换:
// 示例插入逻辑 await db.insert( yourTableName, { // 其他字段... 'createdByUser': createdBy, // 传入CreatedBy对象,转换器自动转成字符串 }, );
3. 可选:完善CreatedBy类的类型定义
为了代码更健壮,建议给name和id指定明确的类型,比如:
@JsonSerializable() class CreatedBy{ String name; int id; // 假设id是整数类型 CreatedBy({required this.name, required this.id}); // 改成带参数的构造函数更安全 factory CreatedBy.fromJson(Map<String, dynamic> json) => _$CreatedByFromJson(json); Map<String, dynamic> toJson() => _$CreatedByToJson(this); }
这样调整后,就能避免类型不匹配的问题,顺利把对象存入本地数据库啦。
内容的提问来源于stack exchange,提问作者John Joe
相关产品推荐
相关产品推荐

