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

Flutter中嵌套JSON对象的实体类创建及fromJson/toJson实现

Flutter嵌套JSON实体类绑定解决方案

1. 定义嵌套实体类

针对包含drivers_license这类嵌套对象的JSON,需要先定义内层实体类,再在外层类中引用它,同时实现对应的fromJson/toJson方法处理嵌套转换。

假设接口返回的JSON结构如下:

{
  "id": 1,
  "name": "John Doe",
  "drivers_license": {
    "license_number": "ABC123",
    "expiry_date": "2028-12-31",
    "issuing_state": "CA"
  }
}

对应的实体类代码:

// 内层:驾照信息实体类
class DriversLicense {
  final String licenseNumber;
  final String expiryDate;
  final String issuingState;

  DriversLicense({
    required this.licenseNumber,
    required this.expiryDate,
    required this.issuingState,
  });

  // 从JSON解析为对象
  factory DriversLicense.fromJson(Map<String, dynamic> json) {
    return DriversLicense(
      licenseNumber: json['license_number'],
      expiryDate: json['expiry_date'],
      issuingState: json['issuing_state'],
    );
  }

  // 将对象转换为JSON
  Map<String, dynamic> toJson() {
    return {
      'license_number': licenseNumber,
      'expiry_date': expiryDate,
      'issuing_state': issuingState,
    };
  }
}

// 外层:服务提供者实体类
class ServiceProviderModel {
  final int id;
  final String name;
  final DriversLicense? driversLicense; // 标记为可选类型,兼容JSON中无该字段的情况

  ServiceProviderModel({
    required this.id,
    required this.name,
    this.driversLicense,
  });

  factory ServiceProviderModel.fromJson(Map<String, dynamic> json) {
    return ServiceProviderModel(
      id: json['id'],
      name: json['name'],
      // 处理嵌套对象:先判断是否存在,再调用内层类的fromJson方法
      driversLicense: json['drivers_license'] != null 
          ? DriversLicense.fromJson(json['drivers_license']) 
          : null,
    );
  }

  Map<String, dynamic> toJson() {
    return {
      'id': id,
      'name': name,
      'drivers_license': driversLicense?.toJson(),
    };
  }
}

2. 接口解析与属性访问示例

调用getall接口后,按如下方式解析并访问嵌套对象属性:

import 'dart:convert';

// 假设接口返回的响应体为responseBody
final Map<String, dynamic> responseData = jsonDecode(responseBody);
ServiceProviderModel provider = ServiceProviderModel.fromJson(responseData);

// 访问嵌套对象的属性(注意空安全判断)
print(provider.driversLicense?.licenseNumber); // 输出:ABC123
print(provider.driversLicense?.expiryDate);    // 输出:2028-12-31

3. 常见问题排查

  • 确保JSON中的键名与fromJson方法中使用的键完全匹配(比如drivers_license是下划线命名,不要误写成驼峰的driversLicense)
  • 如果嵌套对象可能为null,外层类中对应的属性必须声明为可选类型(加?),避免空指针异常
  • 若接口返回的是数组列表,用以下方式批量解析:
    final List<dynamic> listData = jsonDecode(responseBody);
    List<ServiceProviderModel> providers = listData.map((item) => ServiceProviderModel.fromJson(item)).toList();
    

内容的提问来源于stack exchange,提问作者Madusha Prasad

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.17 22:30:13