JsonSerializable - fromJson 在嵌套对象上抛出 _InternalLinkedHashMap<dynamic, dynamic> 异常
Posted
技术标签:
【中文标题】JsonSerializable - fromJson 在嵌套对象上抛出 _InternalLinkedHashMap<dynamic, dynamic> 异常【英文标题】:JsonSerializable - fromJson throwing _InternalLinkedHashMap<dynamic, dynamic> exception on nested object 【发布时间】:2021-05-10 22:05:57 【问题描述】:我使用了这个build.yaml
配置来允许将嵌套对象解析为json:
targets:
$default:
builders:
json_serializable:
options:
explicit_to_json: true
它似乎确实像 toJson
与嵌套对象一样工作正常。然后我尝试使用https://pub.dev/packages/json_serializable从json创建一个类实例:
@override
UserRegistrationEntity getUserRegistration()
final json = Map<String, dynamic>.from(
localDataSource.get(keyToRead: UserRegistrationFieldNames.self) ??
<String, dynamic>);
return UserRegistrationEntity.fromJson(json); <===== ERROR ON THIS LINE
我遇到了这个异常:
抛出异常:类型 '_InternalLinkedHashMap
' 是 不是类型转换中“Map ”类型的子类型
这是json
的值:
红色覆盖的值是字符串。当user_credential_entity.password
和user_credential_entity.emailAddress
为null
时,没有错误。
我认为这是因为user_credential_entity
是一个嵌套的 JsonSerializable 对象。但是toJson
有效,但fromJson
无效。
父类:
part 'user_registration_entity.g.dart';
@JsonSerializable()
class UserRegistrationEntity implements IEntity<UserRegistrationEntity>
UserRegistrationEntity(
this.nickName,
this.emailAddress,
this.confirmEmailAddress,
this.password,
this.confirmPassword,
this.userCredentialEntity);
factory UserRegistrationEntity.fromJson(Map<String, dynamic> json) =>
_$UserRegistrationEntityFromJson(json);
String nickName;
String emailAddress;
String confirmEmailAddress;
String password;
String confirmPassword;
UserCredentialEntity userCredentialEntity;
Map<String, dynamic> toJson() => _$UserRegistrationEntityToJson(this);
子类:
@JsonSerializable()
class UserCredentialEntity implements IEntity<UserCredentialEntity>
UserCredentialEntity(this.password, this.emailAddress);
factory UserCredentialEntity.fromJson(Map<String, dynamic> json) =>
_$UserCredentialEntityFromJson(json);
String password;
String emailAddress;
Map<String, dynamic> toJson() => _$UserCredentialEntityToJson(this);
错误所在的实际代码行在这里:
json['userCredentialEntity']
的值不是Map<String, dynamic>
吗?对我来说有点像。
【问题讨论】:
【参考方案1】:解决方法是把它放在包含嵌套对象的类之上:
@JsonSerializable(explicitToJson: true, anyMap: true)
anyMap: true
是我的关键。
或者,可以将其添加到build.yaml
:
targets:
$default:
builders:
json_serializable:
options:
explicit_to_json: true
any_map: true
这意味着不再需要@JsonSerializable(explicitToJson: true, anyMap: true)
。
【讨论】:
以上是关于JsonSerializable - fromJson 在嵌套对象上抛出 _InternalLinkedHashMap<dynamic, dynamic> 异常的主要内容,如果未能解决你的问题,请参考以下文章
Flutter Freezed 模型升级后的 JsonSerializable 和 JsonKey 问题
JsonSerializable - fromJson 在嵌套对象上抛出 _InternalLinkedHashMap<dynamic, dynamic> 异常