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

如何在Dart的TestObject中映射JSON的嵌套列表(List<List<B>>)

Flutter中嵌套列表List<List<B>>的JSON序列化实现

要处理List<List<B>>这种嵌套列表的JSON映射,核心是两层遍历/转换:外层遍历顶级列表,内层遍历每个子列表里的B对象,分别调用fromJson或toJson方法。以下是具体实现方案:

1. 完善fromJson反序列化方法

对于b字段的解析,需要逐层处理嵌套结构:

  • 先判断JSON中的b字段是否存在
  • 初始化外层列表List<List<B>>
  • 遍历外层的每个子列表,再逐个将子列表中的JSON对象转为B实例,最后将子列表添加到外层列表中

可以用直观的forEach循环实现,也可以用更简洁的map链式调用:

2. 完善toJson序列化方法

序列化时同理,需要逐层将B对象转为JSON结构:

  • 遍历外层的每个子列表
  • 子列表中的每个B对象调用toJson()转为Map,组成子列表后,再将所有子列表组成顶级列表存入结果Map

另外注意修正原代码的错误:toJson方法中不能先给data赋值再初始化,必须先初始化data再添加字段。

完整示例代码

// 先定义A和B的基础类示例(需确保它们正确实现序列化方法)
class A {
  String? name;

  A({this.name});

  A.fromJson(Map<String, dynamic> json) {
    name = json['name'];
  }

  Map<String, dynamic> toJson() {
    final Map<String, dynamic> data = Map<String, dynamic>();
    data['name'] = name;
    return data;
  }
}

class B {
  int? value;

  B({this.value});

  B.fromJson(Map<String, dynamic> json) {
    value = json['value'];
  }

  Map<String, dynamic> toJson() {
    final Map<String, dynamic> data = Map<String, dynamic>();
    data['value'] = value;
    return data;
  }
}

class TestObject {
  String? id;
  List<A>? a;
  List<List<B>>? b;

  TestObject({
    this.id,
    this.a,
    this.b,
  });

  TestObject.fromJson(Map<String, dynamic> json) {
    id = json['id'];

    // 处理List<A>
    if (json['a'] != null) {
      a = <A>[];
      json['a'].forEach((v) {
        a!.add(A.fromJson(v));
      });
    }

    // 处理List<List<B>> - forEach写法(直观易读)
    if (json['b'] != null) {
      b = <List<B>>[];
      json['b'].forEach((outerList) {
        final innerList = <B>[];
        outerList.forEach((item) {
          innerList.add(B.fromJson(item));
        });
        b!.add(innerList);
      });
    }

    // 或者更简洁的map链式调用(二选一即可)
    // b = json['b']?.map((outer) => outer.map((item) => B.fromJson(item)).cast<B>().toList()).cast<List<B>>().toList();
  }

  Map<String, dynamic> toJson() {
    // 先初始化data,修正原代码的顺序错误
    final Map<String, dynamic> data = Map<String, dynamic>();
    data['id'] = id;

    // 处理List<A>
    if (a != null) {
      data['a'] = a!.map((v) => v.toJson()).toList();
    }

    // 处理List<List<B>>
    if (b != null) {
      data['b'] = b!.map((outerList) => outerList.map((item) => item.toJson()).toList()).toList();
    }

    return data;
  }
}

说明

  • forEach写法层级清晰,适合新手理解嵌套结构的解析逻辑
  • map链式调用代码更简洁,适合熟悉Dart集合操作的开发者
  • 必须确保A和B类都正确实现了fromJson和toJson方法,否则嵌套转换会失败

内容的提问来源于stack exchange,提问作者Luke Irvin

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.30 14:00:28