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, ); } }
关键逻辑说明
- final字段赋值规则:Dart的final字段只能在构造函数初始化列表或通过构造函数参数传入时赋值,不能在构造函数体内直接修改(比如
this.medicationSnomed = ...这种写法会报错)。 - 嵌套对象解析顺序:必须先把嵌套的JSON结构解析成对应的类实例,再将这个实例传给上层类的构造函数,完成final字段的初始化。
- 空值处理:如果嵌套字段可能为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
相关产品推荐
相关产品推荐

