JsonSerializable - fromJson выбрасывает исключение _InternalLinkedHashMap <dynamic, dynamic> для вложенного объекта

Я использовал это build.yaml config, чтобы разрешить анализ вложенных объектов в json:

      targets:
    $default:
        builders:
            json_serializable:
                options:
                    explicit_to_json: true

Это определенно сработало, так как с вложенными объектами работает нормально. Затем я пытаюсь создать экземпляр класса из json с помощью https://pub.dev/packages/json_serializable :

        @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<dynamic, dynamic> не является подтипом типа Map<String, dynamic> в приведении типа

В этом ценность 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
                    anyMap: true

Что будет означать @JsonSerializable(explicitToJson: true, anyMap: true) больше не требуется.

Другие вопросы по тегам