JsonSerializable — FromJSON вызывает исключение _InternalLinkedHashMap для вложенного объекта

#flutter #dart #json-serializable

#flutter #dart #json-сериализуемый

Вопрос:

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

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

Кажется, это определенно сработало, так как toJson с вложенными объектами работает нормально. Затем я пытаюсь создать экземпляр класса из 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<динамический, динамический>’ не является подтипом типа ‘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'] не a 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) , что больше не требуется.