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

Flutter JSON转模型后属性返回null、列表长度正常问题如何解决

问题原因
  1. 命名构造函数Item.fromMap的实现逻辑错误:你在构造函数内部创建了一个临时的Item对象,但没有将解析得到的属性赋值给当前类的实例,最终所有实例属性都保留默认的null值,这是属性返回null的核心原因。
  2. packagescors字段解析存在两处错误:
    • 取值时错误使用了不存在的keydevice_details,JSON响应中对应字段的key是packagescors
    • JSON返回的packagescors是单个对象,但是类属性定义为List<Packagescors>?,类型完全不匹配
修复方案

1. 修正Item类的定义和fromMap逻辑

首先调整packagescors属性的类型,重写fromMap构造函数,正确为实例属性赋值:

class Item {
  Item({
    this.sequenceno,
    this.id,
    this.chapter,
    this.title,
    this.packageDescription,
    this.ageLevel,
    this.pkgSequence,
    this.packagescors,
  });

  int? sequenceno;
  String? id;
  String? chapter;
  String? title;
  String? packageDescription;
  List<int>? ageLevel;
  String? pkgSequence;
  // 修正类型:JSON中是单个对象不是数组
  Packagescors? packagescors;

  // 用factory构造函数正确返回实例
  factory Item.fromMap(Map<String, dynamic> map) {
    return Item(
      sequenceno: map["sequenceno"],
      id: map["_id"],
      chapter: map["chapter"],
      title: map["title"],
      packageDescription: map["package_description"],
      ageLevel: map["age_level"] != null
          ? List<int>.from(map["age_level"].map((x) => x))
          : null,
      pkgSequence: map["pkg_sequence"],
      // 修正取值key,适配单个对象的解析
      packagescors: map["packagescors"] != null
          ? Packagescors.fromMap(map["packagescors"])
          : null,
    );
  }

  Map<String, dynamic> toMap() => {
        "sequenceno": sequenceno,
        "_id": id,
        "chapter": chapter,
        "title": title,
        "package_description": packageDescription,
        "age_level": ageLevel,
        "pkg_sequence": pkgSequence,
        "packagescors": packagescors?.toMap(),
      };
}

2. 确认Packagescors类的fromMap逻辑正确

需要确保你定义的Packagescors类的fromMap构造函数实现规范,没有同样的临时对象问题,示例参考:

class Packagescors {
  List<int>? score;
  List<String>? date;

  Packagescors({this.score, this.date});

  factory Packagescors.fromMap(Map<String, dynamic> map) {
    return Packagescors(
      score: map["score"] != null ? List<int>.from(map["score"]) : null,
      date: map["date"] != null ? List<String>.from(map["date"]) : null,
    );
  }

  Map<String, dynamic> toMap() => {
    "score": score,
    "date": date,
  };
}

修改完成后重新运行代码即可正常读取title等属性的值。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.04 23:12:01