Dart中JSON转List<Map>:用构造函数还是普通方法?
解答你的Dart JSON转换问题
嘿,我来帮你梳理下这个问题~你的核心需求是从包含id、name、code的JSON数组中,提取出只保留id和name的List<Map>,同时你还有关于类实例创建和构造函数的疑问,我一步步帮你解决:
一、两种实用实现方案
方案1:基于类的实现(适合需要后续操作数据的场景)
你的代码思路是可行的,我帮你优化成更符合Dart最佳实践的写法。首先把fromJson改成工厂构造函数,然后在循环里创建实例后,调用toJson()就能得到目标Map,最后收集到结果列表即可:
import 'dart:convert'; void main() { List<Map<String, dynamic>> myJsonList = [ {"id": 1, "name": "mike", "code": "01"}, {"id": 2, "name": "piter", "code": "02"} ]; List<Map<String, dynamic>> result = []; for (var item in myJsonList) { MyClass mc = MyClass.fromJson(item); result.add(mc.toJson()); } print(result); // 输出: [{id: 1, name: mike}, {id: 2, name: piter}] } class MyClass { int id; String name; MyClass(this.id, this.name); // 改用工厂构造函数,写法更规范 factory MyClass.fromJson(Map<String, dynamic> json) { return MyClass( json['id'] as int, json['name'] as String, ); } Map<String, dynamic> toJson() { return { 'id': id, 'name': name, }; } }
方案2:直接处理Map(仅需转换结构时更简洁)
如果你的需求只是一次性转换JSON结构,不需要对这些数据做其他业务操作,那完全可以跳过创建类实例这一步,用Dart的map方法直接处理:
void main() { List<Map<String, dynamic>> myJsonList = [ {"id": 1, "name": "mike", "code": "01"}, {"id": 2, "name": "piter", "code": "02"} ]; List<Map<String, dynamic>> result = myJsonList.map((item) { return { 'id': item['id'], 'name': item['name'], }; }).toList(); print(result); // 同样得到目标结果 }
二、解答你的疑问
1. 是否需要在每次循环中创建类实例?
- 如果后续需要对这些数据进行业务逻辑处理(比如修改属性、调用专属方法等),创建类实例非常必要——类可以帮你封装数据和行为,让代码更易维护和扩展。
- 如果只是一次性转换结构,直接处理Map会更高效简洁,不需要额外创建实例。
2. 是否需要保留构造函数?
- 如果用方案1(基于类的实现):构造函数(包括普通构造和
fromJson工厂构造)是必须的,它们负责把JSON数据转换成类的实例,工厂构造是更推荐的写法,逻辑更清晰。 - 如果用方案2(直接处理Map):不需要类,自然也不需要构造函数,直接操作Map即可。
内容的提问来源于stack exchange,提问作者Dmitry Bubnenkov
相关产品推荐
相关产品推荐

