JsonSerializable - fromJson 在嵌套对象上抛出 _InternalLinkedHashMap<dynamic, dynamic> 异常

问题描述

我已使用此 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的值:

enter image description here

红色覆盖的值是字符串。当 user_credential_entity.passworduser_credential_entity.emailAddressnull 时,没有错误

我认为这是因为 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);

错误所在的实际代码在这里

enter image description here

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)