Dart中如何解析JSON响应的动态键并转换为对应实体列表
Dart 动态键JSON响应解析方案
你参考@lrn实现的转换类已经完全可以满足动态键JSON的解析需求,以下是完整的使用说明和优化建议:
核心实现逻辑
不需要提前预定义所有可能的分类字段,只需直接遍历外层JSON的键值对集合:
- 键(Key)直接作为分类名称赋值给分类属性
- 值(Value)是该分类下的书籍数组,直接调用已有的
Book.listFromJson方法转换即可
原有实体类(已适配场景)
class Book { String id = ""; String title = ""; Book(); Book.fromJson(Map<String, dynamic> json) { id = json['id']; title = json['title']; } static List<Book> listFromJson(List<dynamic> json) { return json.map((val) => Book.fromJson(val)).toList(); } }
分类转换类(可直接使用,注意拼写修正)
class Recommendations { String recommendationType; List<Book> recommendations; @override String toString() { // 原代码拼写修正:Recomendations → Recommendations return 'Recommendations[title: $recommendationType]'; } Recommendations.fromJson(MapEntry<String, dynamic> json) { if (json == null) return; this.recommendationType = json.key; this.recommendations = Book.listFromJson(json.value); } static List<Recommendations> listFromJson(Map<String, dynamic> json) { return json == null ? List<Recommendations>.empty() : json.entries .map((value) => new Recommendations.fromJson(value)) .toList(); } }
调用示例
假设你已经通过网络请求拿到了已解码的JSON Map对象,直接调用静态方法即可完成解析:
// responseData为请求返回的已解码JSON Map对象 List<Recommendations> categoryBookList = Recommendations.listFromJson(responseData); // 遍历使用示例 for (var category in categoryBookList) { print("分类名称:${category.recommendationType}"); print("分类下书籍数量:${category.recommendations.length}"); }
可选优化点
- 适配空安全规范:给
recommendationType和recommendations加上required修饰符,或标记为late非空类型 - 增加容错逻辑:在map转换时套入
try/catch,避免单个分类的JSON格式错误导致整体解析失败 - 按需转换结构:如果需要通过分类名快速检索书籍,可以额外把解析结果转成
Map<String, List<Book>>结构,使用效率更高
内容的提问来源于stack exchange,提问作者Nithin Sai
相关产品推荐
相关产品推荐

