如何在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
相关产品推荐
相关产品推荐

