JSON (нотация объектов JavaScript) — это широко используемый формат обмена данными при разработке современного программного обеспечения. При работе с данными JSON в Dart, языке программирования, используемом во Flutter, вы можете столкнуться с исключением, которое гласит: «Необработанное исключение: тип List
Понимание исключения:
Сообщение об исключении не требует пояснений. Это происходит, когда вы пытаетесь декодировать строку JSON, ожидая объект JSON (карту), но вместо этого в декодированном результате получаете массив JSON (список). Система типов Dart строгая и обеспечивает правильные типы во время декодирования JSON.
Метод 1. Проверка структуры JSON.
Один из способов обработки этого исключения — проверка структуры данных JSON перед декодированием. Вы можете использовать функцию jsonDecode()из библиотеки dart:convertдля декодирования строки JSON в динамический объект. Затем вы можете проверить, является ли декодированный объект списком или картой, используя ключевое слово is, и выполнить соответствующие действия соответствующим образом. Вот пример:
import 'dart:convert';
void handleJson(String jsonString) {
dynamic decodedData = jsonDecode(jsonString);
if (decodedData is List) {
// Handle JSON array (List) here
// ...
} else if (decodedData is Map<String, dynamic>) {
// Handle JSON object (Map) here
// ...
}
}
Метод 2: принудительное преобразование типов.
В некоторых случаях вы можете быть уверены в структуре JSON и захотите принудительно преобразовать тип в список или карту. Этого можно добиться, явно приведя декодированный объект. Вот пример:
import 'dart:convert';
void handleJson(String jsonString) {
dynamic decodedData = jsonDecode(jsonString);
List<dynamic> jsonArray = decodedData as List<dynamic>; // Cast to List<dynamic>
// Handle JSON array (List) here
// ...
// OR
Map<String, dynamic> jsonObject = decodedData as Map<String, dynamic>; // Cast to Map<String, dynamic>
// Handle JSON object (Map) here
// ...
}
Метод 3: защитное программирование.
Чтобы полностью избежать исключения, вы можете выполнить защитное программирование, проверив структуру JSON перед декодированием. Вы можете использовать библиотеки, такие как json_annotationи json_serializable, для создания моделей Dart для ваших данных JSON. Определив ожидаемую структуру в этих моделях, вы можете гарантировать, что процесс декодирования не приведет к появлению неожиданных типов. Вот пример:
import 'dart:convert';
class MyDataModel {
final List<dynamic> jsonArray;
final Map<String, dynamic> jsonObject;
MyDataModel({required this.jsonArray, required this.jsonObject});
factory MyDataModel.fromJson(String jsonString) {
dynamic decodedData = jsonDecode(jsonString);
return MyDataModel(
jsonArray: decodedData['array'] as List<dynamic>,
jsonObject: decodedData['object'] as Map<String, dynamic>,
);
}
}
void handleJson(String jsonString) {
MyDataModel data = MyDataModel.fromJson(jsonString);
// Access data.jsonArray and data.jsonObject safely here
// ...
}
Обработка исключения «Необработанное исключение: тип List
Помните: внимательное отношение к структуре JSON и внедрение надежных методов обработки исключений обеспечат плавное декодирование JSON в вашем коде Dart.