Flutter使用fromJson将JSON转Model始终失败问题求助
JSON转Model失败:'null is not subtype of type string in type cast'
使用Freezed生成的fromJson方法解析JSON时抛出null is not subtype of type string in type cast错误,但手动调用构造函数初始化Model完全正常,且已确认JSON中所有必填字段均不为null。
我的Model代码
import 'package:freezed_annotation/freezed_annotation.dart'; part 'user_model.g.dart'; part 'user_model.freezed.dart'; @freezed class UserModel with _$UserModel { const factory UserModel({ required String id, required String identity, required String name, required String email, required String phone, required String role, required String? createdAt, required String? updatedAt, required String? accountVerifiedAt, required String jsonWebToken, }) = _UserModel; const UserModel._(); factory UserModel.fromJson(Map<String, dynamic> json) => _$UserModelFromJson(json); }
报错的解析代码
var user = UserModel.fromJson(object['data']);
可正常运行的手动构造代码
var user = UserModel( id: object['data']['id'], identity: object['data']['identity'], name: object['data']['name'], email: object['data']['email'], phone: object['data']['phone'], role: object['data']['role'], createdAt: object['data']['createdAt'], updatedAt: object['data']['updatedAt'], accountVerifiedAt: object['data']['accountVerifiedAt'], jsonWebToken: object['data']['jsonWebToken'], );
解决方案
检查字段名大小写匹配
Freezed自动生成的序列化代码严格匹配字段名大小写。如果JSON中的字段是下划线命名(比如created_at),但Model参数是小驼峰(createdAt),会导致解析时无法找到对应字段,返回null触发类型转换错误。手动构造时你手动映射了字段,所以不受影响。验证字段类型一致性
即使字段值不为null,若JSON中字段类型和Model定义不符(比如id是数字类型,但Model定义为String),Freezed的强类型转换会直接报错。手动构造时Dart会做隐式类型转换,所以不会出问题。可以打印字段类型确认:
print('id类型: ${object['data']['id'].runtimeType}'); print('jsonWebToken类型: ${object['data']['jsonWebToken'].runtimeType}');
- 重新生成序列化代码
修改Model后若未重新生成代码,_$UserModelFromJson可能和当前Model定义不匹配。执行命令重新生成:
flutter pub run build_runner build --delete-conflicting-outputs
内容的提问来源于stack exchange,提问作者Farhan
相关产品推荐
相关产品推荐

