Flutter解析API JSON列表报错:Null不是bool子类型
Flutter JSON解析问题修复指南
一、修复“type 'Null' is not a subtype of type 'bool'”错误
这个错误的核心原因是:JSON中某个预期为bool类型的字段返回了null,但实体类里对应的字段被定义为非空bool类型,导致解析时类型不匹配。修复方法有三种:
1. 将实体类字段改为可空类型
直接把报错的bool字段声明为bool?,允许其接收null值。比如:
// 修改前 final bool ownerOccupied; // 修改后 final bool? ownerOccupied;
同时在fromJson工厂方法中调整解析逻辑:
ownerOccupied: json['ownerOccupied'] as bool?,
2. 给字段设置默认值
如果业务逻辑要求字段不能为null,可以在解析时给null值设置默认的bool值(true/false):
ownerOccupied: json['ownerOccupied'] as bool? ?? false,
这样即使JSON返回null,也会用默认值填充,避免类型错误。
3. 协调后端修正返回值
如果接口设计上该字段应该始终返回true/false而非null,可以和后端开发人员沟通,让他们修正API返回的JSON数据,确保bool类型字段不返回null。
二、处理实体类与JSON字段不匹配问题
1. 补充实体类未覆盖的JSON字段(如ownerOccupied)
- 手动在对应的实体类中添加缺失的字段,根据JSON的实际类型声明为可空或非空类型。
- 在
fromJson方法中添加该字段的解析逻辑。
示例:
class Property { // 原有字段 final String id; // 添加缺失的字段 final bool? ownerOccupied; Property({required this.id, this.ownerOccupied}); factory Property.fromJson(Map<String, dynamic> json) => Property( id: json['id'] as String, ownerOccupied: json['ownerOccupied'] as bool?, ); }
2. 处理实体类存在但JSON中没有的字段(如Features中的pool)
方案一:改为可空类型
把JSON中不存在的字段声明为可空类型,解析时自然会得到null:
class Features { final bool? pool; Features({this.pool}); factory Features.fromJson(Map<String, dynamic> json) => Features( pool: json['pool'] as bool?, ); }
方案二:设置默认值
如果希望字段始终有值,可以给不存在的字段设置默认值:
class Features { final bool pool; Features({required this.pool}); factory Features.fromJson(Map<String, dynamic> json) => Features( pool: json['pool'] as bool? ?? false, ); }
方案三:删除冗余字段
如果这些字段在业务逻辑中完全没用,直接从实体类中删除即可,减少代码冗余。
额外提示
使用quicktype生成实体类时,记得开启Allow Nullable Fields选项,生成的代码会自动处理可能为null的字段,减少后续手动修改的工作量。
内容的提问来源于stack exchange,提问作者LostTexan
相关产品推荐
相关产品推荐

