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

如何在Flutter中解析指定JSON并转换为Dart模型类?

在Flutter中解析该JSON并生成Dart模型类的方案

1. 分析JSON结构

待解析的JSON如下,注意permissions字段是JSON格式的字符串,而非直接的JSON对象,解析时需要额外处理:

{
    "status": "success",
    "errors": null,
    "message": "Records Found successfully.",
    "data": [
        {
            "id": 2,
            "department_id": 1,
            "permissions": "{\"eventStatus\":\"1\",\"dptStatus\":\"1\",\"empStatus\":\"1\",\"policyStatus\":\"1\",\"openingStatus\":\"1\",\"birthdayStatus\":\"1\",\"hrdStatus\":\"1\",\"supportStatus\":\"1\",\"libraryStatus\":\"1\",\"exemptionStatus\":\"1\",\"settingStatus\":\"1\",\"assetsStatus\":\"1\"}"
        }
    ]
}

2. 生成对应的Dart模型类

我们需要三个层级的模型类来匹配JSON结构,包含完整的序列化/反序列化方法:

import 'dart:convert';

// 最外层API响应模型
class ApiResponse {
  final String status;
  final dynamic errors;
  final String message;
  final List<PermissionData> data;

  ApiResponse({
    required this.status,
    required this.errors,
    required this.message,
    required this.data,
  });

  // 从JSON解析为模型
  factory ApiResponse.fromJson(Map<String, dynamic> json) {
    var dataList = json['data'] as List;
    List<PermissionData> dataItems = dataList.map((item) => PermissionData.fromJson(item)).toList();

    return ApiResponse(
      status: json['status'],
      errors: json['errors'],
      message: json['message'],
      data: dataItems,
    );
  }

  // 模型转为JSON
  Map<String, dynamic> toJson() {
    return {
      'status': status,
      'errors': errors,
      'message': message,
      'data': data.map((item) => item.toJson()).toList(),
    };
  }
}

// 数据列表条目模型
class PermissionData {
  final int id;
  final int departmentId;
  final Permissions permissions;

  PermissionData({
    required this.id,
    required this.departmentId,
    required this.permissions,
  });

  factory PermissionData.fromJson(Map<String, dynamic> json) {
    // 把permissions字符串解析为JSON对象
    Map<String, dynamic> permissionsJson = jsonDecode(json['permissions']);

    return PermissionData(
      id: json['id'],
      departmentId: json['department_id'],
      permissions: Permissions.fromJson(permissionsJson),
    );
  }

  Map<String, dynamic> toJson() {
    return {
      'id': id,
      'department_id': departmentId,
      'permissions': jsonEncode(permissions.toJson()),
    };
  }
}

// 权限详情模型
class Permissions {
  final String eventStatus;
  final String dptStatus;
  final String empStatus;
  final String policyStatus;
  final String openingStatus;
  final String birthdayStatus;
  final String hrdStatus;
  final String supportStatus;
  final String libraryStatus;
  final String exemptionStatus;
  final String settingStatus;
  final String assetsStatus;

  Permissions({
    required this.eventStatus,
    required this.dptStatus,
    required this.empStatus,
    required this.policyStatus,
    required this.openingStatus,
    required this.birthdayStatus,
    required this.hrdStatus,
    required this.supportStatus,
    required this.libraryStatus,
    required this.exemptionStatus,
    required this.settingStatus,
    required this.assetsStatus,
  });

  factory Permissions.fromJson(Map<String, dynamic> json) {
    return Permissions(
      eventStatus: json['eventStatus'],
      dptStatus: json['dptStatus'],
      empStatus: json['empStatus'],
      policyStatus: json['policyStatus'],
      openingStatus: json['openingStatus'],
      birthdayStatus: json['birthdayStatus'],
      hrdStatus: json['hrdStatus'],
      supportStatus: json['supportStatus'],
      libraryStatus: json['libraryStatus'],
      exemptionStatus: json['exemptionStatus'],
      settingStatus: json['settingStatus'],
      assetsStatus: json['assetsStatus'],
    );
  }

  Map<String, dynamic> toJson() {
    return {
      'eventStatus': eventStatus,
      'dptStatus': dptStatus,
      'empStatus': empStatus,
      'policyStatus': policyStatus,
      'openingStatus': openingStatus,
      'birthdayStatus': birthdayStatus,
      'hrdStatus': hrdStatus,
      'supportStatus': supportStatus,
      'libraryStatus': libraryStatus,
      'exemptionStatus': exemptionStatus,
      'settingStatus': settingStatus,
      'assetsStatus': assetsStatus,
    };
  }
}

3. 解析示例代码

假设你已经获取到JSON字符串(比如从API请求返回),可以这样完成解析:

// 示例JSON字符串
String jsonString = '''
{
    "status": "success",
    "errors": null,
    "message": "Records Found successfully.",
    "data": [
        {
            "id": 2,
            "department_id": 1,
            "permissions": "{\"eventStatus\":\"1\",\"dptStatus\":\"1\",\"empStatus\":\"1\",\"policyStatus\":\"1\",\"openingStatus\":\"1\",\"birthdayStatus\":\"1\",\"hrdStatus\":\"1\",\"supportStatus\":\"1\",\"libraryStatus\":\"1\",\"exemptionStatus\":\"1\",\"settingStatus\":\"1\",\"assetsStatus\":\"1\"}"
        }
    ]
}
''';

// 解析为模型对象
Map<String, dynamic> jsonMap = jsonDecode(jsonString);
ApiResponse response = ApiResponse.fromJson(jsonMap);

// 访问解析后的数据
print('响应状态: ${response.status}');
print('第一条数据ID: ${response.data[0].id}');
print('eventStatus权限: ${response.data[0].permissions.eventStatus}');

关键注意事项

  • permissions字段处理:必须用jsonDecode()将字符串转为JSON对象后再解析为模型;反向序列化时用jsonEncode()将模型转为字符串。
  • 空值兼容:errors字段用dynamic类型兼容null或其他错误格式,若需要更严格的类型可改为String?或自定义错误模型。
  • 快速生成工具:复杂JSON结构可借助Dart官方的JSON转Dart工具生成基础模型,再手动调整特殊字段(如本例的permissions字符串)。

内容的提问来源于stack exchange,提问作者Vaibhav Shelke

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.03 17:07:16