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

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包自动生成序列化逻辑,步骤如下:

  1. 添加依赖到pubspec.yaml:
dependencies:
  json_annotation: ^4.8.1

dev_dependencies:
  build_runner: ^2.4.4
  json_serializable: ^6.7.0
  1. 改造实体类添加注解:
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);
}
  1. 生成代码:
    在终端执行命令生成序列化代码:
dart pub run build_runner build

如果需要实时监听文件变化自动更新代码,执行:

dart pub run build_runner watch

这种方式完全由工具生成序列化逻辑,避免人为错误,且维护成本极低,尤其适合复杂嵌套结构的API返回数据处理。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.14 00:04:50