Ошибка при разборе массива JSON Flutter: Исключение: тип '(dynamic) = ›xxx не является подтипом типа' (Map‹ String, dynamic ›) =› List ‹xxx› 'of' f '

Извините, если он повторил вопрос, но я не нашел решения.

Ошибка:

Исключение: тип '(dynamic) = ›PostalModel' не является подтипом типа '(Map‹ String, dynamic ›) =› List' of 'f'

Что я сделал:

  1. Вызов API:

    Future<PostalModel> fetchPhotos(http.Client client) async {
       final response =
        await client.get('https://api.postalpincode.in/pincode/364710');
    
       // Use the compute function to run parsePhotos in a separate isolate.
       return compute(parsePostalPincode, response.body);
    }
    
  2. разбор JSON:

     // A function that converts a response body into a List.
     PostalModel parsePostalPincode(String responseBody) {
       print(responseBody);
       final parsed = jsonDecode(responseBody).cast<Map<String, dynamic>>();
       print('Parsed : $parsed'); //Getting Log OUTPUT
       PostalModel postalModel = parsed.map<List<PostalModel>>((json) => PostalModel.fromJson(json));
       print('Postal Model : $postalModel'); //Getting Log OUTPUT
       return postalModel;
     }
    
  3. Связывание данных в теле:

    body: FutureBuilder<PostalModel>(
      future: fetchPhotos(http.Client()),
      builder: (context, snapshot) {
        print('snapshot $snapshot'); // Getting Error Here
        // "AsyncSnapshot<PostalModel>(ConnectionState.done, null, Exception: type '(dynamic) => PostalModel' is not a subtype of type '(Map<String, dynamic>) => List<PostalModel>' of 'f')"
        if (snapshot.hasError) print(snapshot.error);
    
        return snapshot.hasData
           ? PostOfficeList(postOfficeList: snapshot.data.postOffice)
           : Center(child: CircularProgressIndicator());
      },
    ),
    

Вы можете проверить JSON из ссылки API, и я создал класс модели из здесь.


person Pratik Butani    schedule 04.11.2020    source источник


Ответы (2)


API возвращает массив JSON, а не объект JSON, так что это List, а не Map.

т.е. если имя вашего класса модели - User, User JSON - это первый элемент массива JSON.

Итак, чтобы получить первый элемент, используйте первый индекс. Обновление информации о загрузке изнутри

return Users.fromJson(jsonresponse[0]);
person RAMU PAL    schedule 05.11.2020

И, наконец, я добился успеха со следующим решением:

// A function that converts a response body into a List.
PostalModel parsePostalPincode(String responseBody) {
  final parsed = jsonDecode(responseBody).cast<Map<String, dynamic>>();
  print('Parsed : $parsed[0]'); 
  PostalModel postalModel = PostalModel.fromJson(parsed[0]);
  print('Postal Model : $postalModel');
  return postalModel;
}

Flutter - это безумие для новичка. :П

person Pratik Butani    schedule 05.11.2020