Dart嵌套JSON转模型异常:无法获取列表字段数据求助
嵌套JSON转Dart对象的问题修复与优化方案
问题定位
你的代码核心错误是Person.fromJson方法里的条件判断逻辑完全写反:
当json['address']不为空时,你只初始化了一个空的List<Address>,却没有遍历数组元素添加实例;反而在json['address']为空时才执行遍历操作,直接导致address列表始终为空,自然打印不出国家名称。
修复后的代码
修改nested_json.dart中的Person类
class Person{ String? name; int? age; String? city; List<Address>? address; Person({this.name, this.age, this.city, this.address}); Person.fromJson(Map<String, dynamic> json){ name = json['name']; age = json['age']; city = json['city']; // 修正逻辑:address不为空时遍历元素添加实例 if(json['address']!=null){ address=<Address>[]; (json['address'] as List).forEach((e){ address!.add(Address.fromJson(e)); }); } // address为空时保持null即可,无需额外操作 } } // Address类无需修改 class Address{ String? country; String? city; Address({this.country, this.city}); Address.fromJson(Map<String, dynamic> json){ country = json['country']; city = json['city']; } }
修改后运行main.dart,就能得到预期输出:china和Bangladesh会正常打印。
优化方案:自动生成序列化代码
手动编写fromJson/toJson不仅繁琐,还极易出错,推荐使用官方生态的json_serializable包自动生成序列化逻辑,步骤如下:
- 添加依赖到
pubspec.yaml:
dependencies: json_annotation: ^4.8.1 dev_dependencies: build_runner: ^2.4.4 json_serializable: ^6.7.0
- 改造实体类添加注解:
import 'package:json_annotation/json_annotation.dart'; // 自动生成的代码文件路径,需与当前文件对应 part 'nested_json.g.dart'; @JsonSerializable() class Person{ String? name; int? age; String? city; List<Address>? address; Person({this.name, this.age, this.city, this.address}); // 自动生成的fromJson方法 factory Person.fromJson(Map<String, dynamic> json) => _$PersonFromJson(json); // 自动生成的toJson方法 Map<String, dynamic> toJson() => _$PersonToJson(this); } @JsonSerializable() class Address{ String? country; String? city; Address({this.country, this.city}); factory Address.fromJson(Map<String, dynamic> json) => _$AddressFromJson(json); Map<String, dynamic> toJson() => _$AddressToJson(this); }
- 生成代码:
在终端执行命令生成序列化代码:
dart pub run build_runner build
如果需要实时监听文件变化自动更新代码,执行:
dart pub run build_runner watch
这种方式完全由工具生成序列化逻辑,避免人为错误,且维护成本极低,尤其适合复杂嵌套结构的API返回数据处理。
内容的提问来源于stack exchange,提问作者appdev
相关产品推荐
相关产品推荐

