#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)
, что больше не требуется.