Я пытаюсь получить ответ 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
Что может быть причиной?

Вы должны преобразовать runtimeType из data из _InternalLinkedHashMap в фактическое List.
Один из способов — использовать List.from.
final _data = List<dynamic>.from(
data.map<dynamic>(
(dynamic item) => item,
),
);
Вот 2 распространенных причины, по которым это может пойти не так:
Если ваш ответ представляет собой массив 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
Если ваш ответ представляет собой объект 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"]);
@Diyen Momjang, мой массив похож на ключ данных: [{ключ: значение}, {ключ: значение}, {ключ: значение}], и я столкнулся с той же проблемой, вы можете мне помочь?
проверьте формат ответа API. e.x => var decode= json.decoder(response.body)
У меня была такая же ошибка при использовании 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
он использовал фрагмент для firebasedatabase
дайте больше деталей
Вы можете получить эту ошибку, если используете дооснащение.дротик и объявляете неверный тип возвращаемого значения для ваших аннотированных методов:
@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
Это сработало для меня:
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.
Если вы работаете с 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/…
Похоже, эта ошибка может появиться в зависимости от различных ошибок разработчика.
В моем случае я использовал ключ EasyLocalization, но не определял его в файле asset/lang/en_US.json.
и как мы конвертируем List<dynamic> в List<Map<String, dynamic>