#flutter #dart
Вопрос:
Я пытаюсь десериализовать очень сложный JSON в Dart, однако я не знаю, что не так.
Как только он попытался десериализовать, он показал мне эту ошибку: «тип» _InternalLinkedHashMap<Строка, динамическая> «не является подтипом типа «Список» в приведении типа».
Кто-нибудь знает, что происходит?
Вот мой код:
Json
{
"Instytucja": [
"TypInstytucji": "bank krajowy",
"PodtypInstytucji": "bank centralny",
"NrInstytucji": 101,
"NazwaInstytucji": "Narodowy Bank Polski",
"SymbolLiterowy": "NBP",
"DataRozpDzial": "1945-01-15",
"NIP": 5250008198,
"IdentyfikatorLEI": "549300K7Z2KT76WQJD18",
"WWW": "www.nbp.pl",
"Jendostka": [
{
"NrEwidencyjny": "A000001",
"TypJednostki": "Centrala",
"NazwaJednostki": "Centrala",
"SymbolLiterowy": "C-la",
"DaneAdresowe": {
"kraj": "POLSKA",
"wojewodztwo": "MAZOWIECKIE",
"powiat": "Warszawa",
"miejscowosc": "Warszawa",
"ulica": "ul. Świętokrzyska",
"numerBudynku": "11/21",
"kodPocztowy": "00-919",
"poczta": "Warszawa",
"nrSkrytkiPocztowej": 1011
},
"DataPodjeciaDzialalnosci": "1945-01-15",
"NumerTelefonu": "22 185 10 10",
"NumerFaksu": "22 185 23 09",
"NumerRozliczeniowy": [
{
"NrRozliczeniowy": 10100000,
"NazwaNumeru": "Centrala",
"KodyBIC": [
"BIC NBPLPLPWXXX",
"BIC SEPA NBPLPLPWXXX"
],
"DataWygenerowania": "1945-01-15"
},
{
"NrRozliczeniowy": 10100055,
"NazwaNumeru": "Centrala - B2B Collect",
"KodyBIC": [
"BIC NBPLPLPWXXX",
"BIC SEPA NBPLPLPWXXX"
],
"DataWygenerowania": "2008-04-01"
},
{
"NrRozliczeniowy": 10100068,
"NazwaNumeru": "Centrala - NBPCollect",
"KodyBIC": [
"BIC NBPLPLPWXXX",
"BIC SEPA NBPLPLPWXXX"
],
"DataWygenerowania": "2008-10-01"
},
{
"NrRozliczeniowy": 10100071,
"NazwaNumeru": "Centrala - B2B-2",
"KodyBIC": [
"BIC NBPLPLPWXXX",
"BIC SEPA NBPLPLPWXXX"
],
"DataWygenerowania": "2016-08-01"
}
]
},
]
]
}
Сущность
import 'package:equatable/equatable.dart';
abstract class Bank extends Equatable {
List<Institution> get institutions;
}
abstract class Institution extends Equatable {
List<Unit> get units;
}
abstract class Unit extends Equatable {
List<SortNumber> get sortNumbers;
}
abstract class SortNumber extends Equatable {
int get sortNumber;
}
Модель
import 'package:jaki_to_bank/features/home/domain/entities/bank.dart';
import 'package:json_annotation/json_annotation.dart';
part 'bank_model.g.dart';
@JsonSerializable()
class BankModel extends Bank {
BankModel({required this.institutions});
factory BankModel.fromJson(Map<String, dynamic> json) => _$BankModelFromJson(json);
@override
@JsonKey(name: 'Instytucja')
final List<InstitutionModel> institutions;
@override
List<Object?> get props => [institutions];
}
@JsonSerializable()
class InstitutionModel extends Institution {
InstitutionModel({required this.units});
factory InstitutionModel.fromJson(Map<String, dynamic> json) => _$InstitutionModelFromJson(json);
@override
@JsonKey(name: 'Jednostka')
final List<UnitModel> units;
@override
List<Object?> get props => [units];
}
@JsonSerializable()
class UnitModel extends Unit {
UnitModel({required this.sortNumbers});
factory UnitModel.fromJson(Map<String, dynamic> json) => _$UnitModelFromJson(json);
@override
@JsonKey(name: 'NumerRozliczeniowy')
final List<SortNumberModel> sortNumbers;
@override
List<Object?> get props => [sortNumbers];
}
@JsonSerializable()
class SortNumberModel extends SortNumber {
SortNumberModel({required this.sortNumber});
factory SortNumberModel.fromJson(Map<String, dynamic> json) => _$SortNumberModelFromJson(json);
@override
@JsonKey(name: 'NrRozliczeniowy')
final int sortNumber;
@override
List<Object?> get props => [sortNumber];
}
Источник данных
import 'dart:convert';
import 'package:flutter/services.dart';
import 'package:jaki_to_bank/core/app/files.dart';
import 'package:jaki_to_bank/features/home/data/models/bank_model.dart';
import 'package:jaki_to_bank/features/home/domain/entities/bank.dart';
abstract class BanksDataSource {
Future<Bank> getBanksList();
}
class BanksDataSourceImpl extends BanksDataSource {
@override
Future<Bank> getBanksList() async {
final String source = Files.banks;
final String banks = await rootBundle.loadString(source);
final Map<String, dynamic> banksMap = jsonDecode(banks);
return BankModel.fromJson(banksMap);
}
}
Трассировка стека
Комментарии:
1. показать ошибку полной трассировки стека
2. Пожалуйста, покажите нам JSON, который вы пытаетесь дезертировать. Сообщение об ошибке, по-видимому, указывает на то, что вы пытаетесь привести карту в JSON в список.
3. @wxker Готово, я отредактировал сообщение с помощью кода JSON.
4. Почему люди голосуют против совершенно хорошего поста, выше моего понимания. Я проголосовал за то, чтобы просто нейтрализовать это, а также показать, что у вас есть совершенно хороший вопрос.
5. Спасибо! У вас есть какие-нибудь идеи, как это решить?
Ответ №1:
Ваш JSON неправильно сформирован.
{
"Instytucja": [
{ <-- missing this
"TypInstytucji": "bank krajowy",
"PodtypInstytucji": "bank centralny",
...
}
]
}
Ответ №2:
Попробуйте добавить @JsonSerializable(explicitToJson: true) в свою модель учреждения (и там, где у вас есть вложенные классы), а затем запустите:
flutter pub run build_runner build --delete-conflicting-outputs
для получения дополнительной информации проверьте flutter.dev: https://flutter.dev/docs/development/data-and-backend/json?fbclid=IwAR2sA4lF5zRGneFH4KAqtYLLQXKF6dJqJ8QzmuY-NuEe-hiRPDUx5eNfRa8#generating-code-for-nested-classes