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

存储到本地数据库前将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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.09 10:22:54