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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.04 01:09:05