Необработанное исключение: InternalLinkedHashMap<String, dynamic>’ не является подтипом типа ‘List<dynamic>

Я пытаюсь получить ответ JSON с сервера и вывести его на консоль.

Future<String> login() async {
    var response = await http.get(
        Uri.encodeFull("https://etrans.herokuapp.com/test/2"),
        headers: {"Accept": "application/json"});

    this.setState(() {
      data = json.decode(response.body);
    });


    print(data[0].name);
    return "Success!";
  }

Unhandled Exception: type '_InternalLinkedHashMap<String, dynamic>' is not a subtype of type 'List

Что может быть причиной?

Как сделать HTTP-запрос в Javascript?
Как сделать HTTP-запрос в Javascript?
В JavaScript вы можете сделать HTTP-запрос, используя объект XMLHttpRequest или более новый API fetch. Вот пример для обоих методов:
96
0
176 800
12
Перейти к ответу Данный вопрос помечен как решенный

Ответы 12

Вы должны преобразовать runtimeType из data из _InternalLinkedHashMap в фактическое List.

Один из способов — использовать List.from.

final _data = List<dynamic>.from(
  data.map<dynamic>(
    (dynamic item) => item,
  ),
);
Ответ принят как подходящий

Вот 2 распространенных причины, по которым это может пойти не так:

  1. Если ваш ответ представляет собой массив json, например

    [
        {
          key1: value1,
          key2: value2,
          key3: value3,
        },
        {
          key1: value1,
          key2: value2,
          key3: value3,
        },
    
        .....
    ] 
    

    Затем мы используем data[0]["name"], а не data[0].name. Если мы не приведем к объекту, у которого есть свойство name, мы не можем использовать data[0].name.

    Мы кастуем вот так data = json.decode(response.body).cast<ObjectName>();

    ObjectName может быть любым объектом, который вы хотите (встроенным или пользовательским). Но убедитесь, что у него есть свойство name

  2. Если ваш ответ представляет собой объект JSON, например

    {
        dataKey: [
          {
            key1: value1,
            key2: value2,
            key3: value3,
          } 
        ] 
    }
    

    Тогда json.decode вернет карта, а не Список.

    Map<String, dynamic> map = json.decode(response.body);
    List<dynamic> data = map["dataKey"];
    print(data[0]["name"]);
    

и как мы конвертируем List<dynamic> в List<Map<String, dynamic>

Rammehar Sharma 23.11.2021 13:11

@Diyen Momjang, мой массив похож на ключ данных: [{ключ: значение}, {ключ: значение}, {ключ: значение}], и я столкнулся с той же проблемой, вы можете мне помочь?

AMAL MOHAN N 16.12.2021 10:45

проверьте формат ответа API. e.x => var decode= json.decoder(response.body)

AK IJ 06.02.2022 11:33

У меня была такая же ошибка при использовании json_annotation, json_serializable, build_runner. Это происходит при вызове метода ClassName.fromJson() для класса, у которого есть свойство класса (пример: у класса User есть свойство класса Address).

В качестве решения я изменил сгенерированные *.g.dart файлы каждого класса, изменив Map<String, dynamic>) на Map<dynamic, dynamic>) везде, где внутри метода есть глубокое преобразование _$*FromJson

Единственная проблема заключается в том, что вам придется менять его снова каждый раз, когда вы регенерируете свои файлы.

Если вам нужна работа с общими полями, есть обходной путь:

class DicData
{
  int tot;
  List<Map<String, dynamic>> fields;

  DicData({
    this.tot,
    this.fields
  });

 factory DicData.fromJson(Map<String, dynamic> parsedJson) {
    return DicData(
        tot: parsedJson['tot'],
        //The magic....
        fields : parsedJson["fields"] = (parsedJson['fields'] as List)
            ?.map((e) => e == null ? null : Map<String, dynamic>.from(e))
            ?.toList()
    );
  }

}

Вы можете использовать new Map<String, dynamic>.from(snapshot.value);

используйте response.body вместо snapshot.value

AKASH MATHWANI 03.04.2020 19:44

он использовал фрагмент для firebasedatabase

Rajesh Jr. 10.06.2020 15:15

дайте больше деталей

Llama 30.10.2020 20:19

Вы можете получить эту ошибку, если используете дооснащение.дротик и объявляете неверный тип возвращаемого значения для ваших аннотированных методов:

@GET("/search")
Future<List<SearchResults>> getResults(); 
// wrong! search results contains a List but the actual type returned by that endpoint is SearchResults 

против

@GET("/search")
Future<SearchResults> getResults(); 
// correct for this endpoint - SearchResults is a composite with field for the list of the actual results

Это сработало для меня:

  1. Создать список данных
  2. Используйте карту для декодирования файла JSON
  3. Используйте данные объекта списка, чтобы получить имя файлов JSON.
  4. С помощью индекса и объекта списка я динамически распечатывал элементы из файла JSON.
setState(){

    Map<String, dynamic> map = json.decode(response.body);
    Data  = map["name"];
}

// for printing
Data[index]['name1'].toString(),

Это сработало для меня.. 1) Создайте список данных, 2) Используйте карту для декодирования файла json, 3) Используйте данные объекта списка, чтобы получить имя файлов json. 4) С помощью индекса и объекта списка я распечатал элементы динамически из файла json.

SWETA DEY 21.07.2020 09:35

Если вы работаете с Firebase Cloud, убедитесь, что вы не пытаетесь добавить несколько данных с одним и тем же DocumentID;

firestore.collection('user').document(UNIQUEID).setData(educandos[0].toJson()).

As не меняет тип, это просто утверждение.

Вам нужно использовать:

map['eventType'].cast<String, dynamic>() или

Map<String, dynamic>.from(map['eventType'])

Вы также можете решить таким образом:

Map<String, dynamic> myMap = Map<String, dynamic>.from(/*Your Source*/ );

Самый простой способ (одномерный):

Map<String, dynamic> data = new Map<String, dynamic>.from(json.decode(response.body));

print(data['name']);

Вы пытаетесь обработать экземпляр InternalLinkedHashMap, что невозможно.

Вы должны сериализовать и десериализовать вернуться к Map<String, dynamic>.

InternalLinkedHashMap<String, dynamic> invalidMap;

final validMap =
        json.decode(json.encode(invalidMap)) as Map<String, dynamic>;

у меня такая же проблема. ты не против проверить это? stackoverflow.com/questions/67564553/…

Blanc Chen 23.05.2021 09:19

Похоже, эта ошибка может появиться в зависимости от различных ошибок разработчика.
В моем случае я использовал ключ EasyLocalization, но не определял его в файле asset/lang/en_US.json.

Другие вопросы по теме