Демистификация декодирования JSON в Dart: обработка исключений «List» и «Map»

JSON (нотация объектов JavaScript) — это широко используемый формат обмена данными при разработке современного программного обеспечения. При работе с данными JSON в Dart, языке программирования, используемом во Flutter, вы можете столкнуться с исключением, которое гласит: «Необработанное исключение: тип List» не является подтипом типа Map». В этой статье мы углубимся в это исключение и рассмотрим различные методы его эффективной обработки.

Понимание исключения:
Сообщение об исключении не требует пояснений. Это происходит, когда вы пытаетесь декодировать строку 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» не является подтипом исключения типа «Map» в Dart требует понимания структуры ваших данных JSON и применения соответствующих методов обработки. Проверяя структуру JSON, выполняя принудительное преобразование типов или используя защитное программирование с моделями Dart, вы можете уверенно обрабатывать сценарии декодирования JSON и предотвращать неожиданные исключения в ваших приложениях Flutter.

Помните: внимательное отношение к структуре JSON и внедрение надежных методов обработки исключений обеспечат плавное декодирование JSON в вашем коде Dart.