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

