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

Flutter保留final/const时如何处理嵌套对象类的JSON解析

解决Flutter中final字段嵌套JSON对象的解析问题

要在保留final/const修饰符的前提下完成嵌套对象的JSON解析,核心是通过工厂构造函数先解析嵌套对象,再通过类的主构造函数初始化所有final字段——因为Dart的final字段只能在实例化阶段赋值,无法在构造函数体内直接修改。

正确的类实现示例

以下是完整的Welcome、MedicationSNOMED、Posologia类实现,包含正确的JSON解析逻辑:

Posologia类

class Posologia {
  final String? dose;
  final String? frequency;

  Posologia({this.dose, this.frequency});

  factory Posologia.fromJson(Map<String, dynamic> json) {
    return Posologia(
      dose: json['dose'],
      frequency: json['frequency'],
    );
  }
}

MedicationSNOMED类

class MedicationSNOMED {
  final String? id;
  final String? name;
  final Posologia? posologia;

  MedicationSNOMED({this.id, this.name, this.posologia});

  factory MedicationSNOMED.fromJson(Map<String, dynamic> json) {
    return MedicationSNOMED(
      id: json['id'],
      name: json['name'],
      // 先解析嵌套的Posologia对象
      posologia: json['posologia'] != null 
          ? Posologia.fromJson(json['posologia']) 
          : null,
    );
  }
}

Welcome类(核心修正)

class Welcome {
  final String? status;
  final MedicationSNOMED? medicationSnomed;

  Welcome({this.status, this.medicationSnomed});

  factory Welcome.fromJson(Map<String, dynamic> json) {
    // 1. 先提取并解析嵌套的medicationSnomed JSON对象
    final medSnomedJson = json['medicationSnomed'];
    final medicationSnomedInstance = medSnomedJson != null 
        ? MedicationSNOMED.fromJson(medSnomedJson) 
        : null;

    // 2. 通过主构造函数传入所有final字段的值
    return Welcome(
      status: json['status'],
      medicationSnomed: medicationSnomedInstance,
    );
  }
}

关键逻辑说明

  1. final字段赋值规则:Dart的final字段只能在构造函数初始化列表或通过构造函数参数传入时赋值,不能在构造函数体内直接修改(比如this.medicationSnomed = ...这种写法会报错)。
  2. 嵌套对象解析顺序:必须先把嵌套的JSON结构解析成对应的类实例,再将这个实例传给上层类的构造函数,完成final字段的初始化。
  3. 空值处理:如果嵌套字段可能为null,要先做非空判断,避免调用fromJson时传入null导致运行时错误。

扩展:解析嵌套数组

如果需要解析嵌套数组(比如final List<MedicationSNOMED>? medications;),可以这样处理:

factory Welcome.fromJson(Map<String, dynamic> json) {
  final medsJsonList = json['medications'] as List?;
  final medicationsList = medsJsonList?.map((medJson) => MedicationSNOMED.fromJson(medJson)).toList();

  return Welcome(
    status: json['status'],
    medications: medicationsList,
  );
}

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.14 21:55:28