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

使用fromMap解析JSON响应为Dart实体时全部字段为空,求排查

问题诊断与修复方案

首先一眼就看到了核心问题:你的Test类定义里出现了类名和构造函数名不匹配的笔误,这直接导致了字段全为null的情况。

具体问题分析

你定义的类名是Test,但构造函数(包括默认构造函数和fromMap命名构造函数)却写成了Feature:

class Test{
 final String id;
 final String name;
 const Feature({ this.id, this.name, }); // 这里构造函数名是Feature,不是Test!
 Feature.fromMap(Map<String, dynamic> map) : id= map['id'], name= map['name'];
}

这相当于你给一个不存在的Feature类写了构造函数,而Test类本身只有Dart自动生成的无参构造函数。当你调用Test.fromMap(data['doc'])时,这个构造函数根本不属于Test类——如果是新版本Dart,这应该直接编译报错,但你说没有错误信息,大概率是代码复制时的混淆,或者你实际运行的代码里类名和构造函数名搞反了。

修复步骤

把构造函数的名字改成和类名一致的Test:

class Test{
  final String id;
  final String name;

  // 默认构造函数
  const Test({ this.id, this.name, });

  // 命名构造函数fromMap
  Test.fromMap(Map<String, dynamic> map) : 
    id = map['id'], 
    name = map['name'];
}

额外注意事项

  1. JSON格式问题:你提供的JSON里有多余的尾逗号(比如"name":"Test Document",和"name":"X2"后面的逗号),严格来说这是无效JSON,虽然部分解析器能容忍,但建议后端修复,或者确保你的解析逻辑支持宽松模式。
  2. 空安全适配(Dart 2.12+):如果你的项目启用了空安全,final String id这类非空字段必须被初始化,要么给字段加上可空标记String?,要么在构造函数里给参数加required:
    // 允许字段为空的版本
    class Test{
      final String? id;
      final String? name;
    
      const Test({ this.id, this.name, });
    
      Test.fromMap(Map<String, dynamic> map) : 
        id = map['id'], 
        name = map['name'];
    }
    
    // 字段必须非空的版本
    class Test{
      final String id;
      final String name;
    
      const Test({ required this.id, required this.name, });
    
      Test.fromMap(Map<String, dynamic> map) : 
        id = map['id'] as String, 
        name = map['name'] as String;
    }
    
  3. 验证数据存在性:在返回前可以加一句print(data['doc']),确认这个Map里确实包含id和name字段,避免JSON结构和你预期的不一致。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.28 06:20:47