如何将Hive中存储的JSON字符串转换为List<LanguageModel>对象列表
Hive存储字符串转List实现方案
前置要求
你的LanguageModel类需要正确实现fromJson工厂构造方法、toJson实例方法,字段定义要和接口返回的JSON结构完全匹配,示例如下:
import 'dart:convert'; class LanguageModel { // 替换为你的模型实际字段 final int id; final String languageName; final String languageCode; LanguageModel({ required this.id, required this.languageName, required this.languageCode, }); // 反序列化用:JSON转模型 factory LanguageModel.fromJson(Map<String, dynamic> json) { return LanguageModel( id: json['id'] as int, // 字段名必须和接口返回的key完全一致,大小写也要匹配 languageName: json['language_name'] as String, languageCode: json['language_code'] as String, ); } // 序列化用:模型转JSON,你存数据到Hive时会用到 Map<String, dynamic> toJson() { return { 'id': id, 'language_name': languageName, 'language_code': languageCode, }; } }
转换实现步骤
1. 确认存储逻辑正确(排查转换失败的常见原因)
存数据到Hive时要先序列化再存储,正确逻辑示例:
// 拿到接口返回的原始列表 List<LanguageModel> originList = 接口响应的列表数据; // 先把模型列表转成JSON数组再编码为字符串 String storeStr = jsonEncode(originList.map((e) => e.toJson()).toList()); // 存入Hive,替换为你自己的Box名和存储key await Hive.box('configBox').put('language_list', storeStr);
2. 取出数据并反序列化为List
// 从Hive取出存储的字符串 final box = Hive.box('configBox'); String? jsonStr = box.get('language_list'); List<LanguageModel> resultList = []; if (jsonStr != null) { // 第一步:把字符串解码为List<dynamic>类型的JSON数组 List<dynamic> jsonArray = jsonDecode(jsonStr); // 第二步:遍历数组每一项转成LanguageModel resultList = jsonArray.map((item) => LanguageModel.fromJson(item)).toList(); } // 得到的resultList可直接传给Widget使用
常见异常排查
- 类型转换错误:如果接口返回的字段类型和你定义的模型字段类型不匹配,比如数字以字符串格式返回,需要手动处理类型转换,示例:
id: int.parse(json['id'] as String) - 空值异常:如果接口可能返回空字段,需要添加空判断处理,示例:
languageName: json['language_name'] ?? '默认值' - 字段不匹配:如果
fromJson里的key和接口返回的key大小写、拼写不一致,会导致取值为空或者抛异常,需逐一核对字段
内容的提问来源于stack exchange,提问作者William Andres
相关产品推荐
相关产品推荐

