Flutter中如何将按章节分组的JSON数据转为自定义模型列表
实现方案
首先需要修正你现有Titles模型的类型适配问题:你当前定义的ageLevel字段为String?类型,但JSON返回的age_level是数组格式,直接赋值会触发类型异常,先调整字段定义:
class Titles{ String? sequenceno; String? id; String? chapter; String? title; String? packageDescription; List<dynamic>? ageLevel; // 替换原有String?类型,也可根据业务明确为List<int>? String? pkgSequence; String? packagescors; // 剩余原有代码无需改动 ... }
场景1:保留分组结构存储
如果你需要保留章节分组关系,可存储为Map<String, List<Titles>>格式,键为章节名,值为对应章节的所有Titles模型列表,实现代码如下:
Map<String, List<Titles>> chapterGroupedList = {}; uniqueSetOfChapters.forEach((chapterName, chapterItemList) { // 遍历当前章节的所有JSON项,转换为Titles模型 List<Titles> convertedList = chapterItemList.map((item) => Titles.fromMap(item)).toList(); chapterGroupedList[chapterName] = convertedList; });
场景2:合并为平级总列表存储
如果你不需要保留分组关系,要把所有数据合并为一个统一列表存储,实现代码如下:
List<Titles> allTitlesList = []; uniqueSetOfChapters.forEach((chapterName, chapterItemList) { allTitlesList.addAll(chapterItemList.map((item) => Titles.fromMap(item)).toList()); });
额外兼容优化
你当前fromMap工厂方法直接赋值会存在数字转字符串的类型异常风险(比如JSON中sequenceno、pkg_sequence返回值为数字类型,直接赋值给String?会报错),建议修改为统一做类型转换:
factory Titles.fromMap(Map<String, dynamic> map) { return Titles( sequenceno: map['sequenceno']?.toString(), id: map["_id"]?.toString(), chapter: map['chapter']?.toString(), title: map['title']?.toString(), packageDescription: map['package_description']?.toString(), ageLevel: map['age_level'], pkgSequence: map['pkg_sequence']?.toString(), ); }
内容的提问来源于stack exchange,提问作者Febin Johnson
相关产品推荐
相关产品推荐

