0

I have used this build.yaml config to allow nested objects to be parsed to json:

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

It definitely seems to have worked as the toJson with nested objects works fine. Then I'm trying to create a class instance from json with 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
  }

I'm getting this exception:

Thrown exception: type '_InternalLinkedHashMap<dynamic, dynamic>' is not a subtype of type 'Map<String, dynamic>' in type cast

This is the value of json:

enter image description here

The red covered values are strings. When the user_credential_entity.password and user_credential_entity.emailAddress are null, there is no error.

I think it's because user_credential_entity is a nested JsonSerializable object. However toJson works, but fromJson doesn't.

the parent class:

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);

the child class:

@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);

The actual line of code the error is on is here:

enter image description here

Is the value of json['userCredentialEntity'] not a Map<String, dynamic>? Kinda looks like one to me.

BeniaminoBaggins
  • 11,202
  • 41
  • 152
  • 287

1 Answers1

1

The fix was to place this above the class which holds nested objects:

@JsonSerializable(explicitToJson: true, anyMap: true)

anyMap: true was the key for me.

Or instead, this can be added to build.yaml:

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

Which will mean @JsonSerializable(explicitToJson: true, anyMap: true) is no longer required.

BeniaminoBaggins
  • 11,202
  • 41
  • 152
  • 287