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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.14 06:23:07