问题描述
我已使用此 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
这是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>
吗?对我来说有点像。
解决方法
修复方法是将它放在包含嵌套对象的类之上:
@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)
。