0

我已使用此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<dynamic, dynamic>' 不是类型转换中类型 'Map<String, dynamic>' 的子类型

这是 的值json

在此处输入图像描述

红色覆盖的值是字符串。当user_credential_entity.passwordanduser_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);

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

在此处输入图像描述

的值json['userCredentialEntity']不是 aMap<String, dynamic>吗?有点像我。

4

1 回答 1

0

解决方法是将其放在包含嵌套对象的类之上:

@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)不再需要。

于 2021-02-07T03:05:27.650 回答