我正在尝试从服务器获取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!";
}
未处理的异常:类型为“ _InternalLinkedHashMap”为 不是'List
类型的子类型
可能是什么原因?
答案 0 :(得分:22)
您可以使用
new Map<String, dynamic>.from(snapshot.value);
答案 1 :(得分:6)
最简单的方法(一维):
Map<String, dynamic> data = new Map<String, dynamic>.from(json.decode(response.body));
print(data['name']);
答案 2 :(得分:4)
如果您需要使用通用字段,请采取以下解决方法:
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()
);
}
}
答案 3 :(得分:2)
如果您使用的是retrofit.dart,并且为带注释的方法声明了错误的返回类型,则会出现此错误:
@GET("/search")
Future<List<SearchResults>> getResults();
// wrong! search results contains a List but the actual type returned by that endpoint is SearchResults
vs
@GET("/search")
Future<SearchResults> getResults();
// correct for this endpoint - SearchResults is a composite with field for the list of the actual results
答案 4 :(得分:2)
因为不会改变类型,只是断言。
您需要使用map['eventType'].cast<String, dynamic>()
或Map<String, dynamic>.from(map['eventType'])
您也可以通过以下方式解决:
Map<String, dynamic> myMap = new Map<String, dynamic>.from(/*Your Source*/ );
答案 5 :(得分:1)
有两种常见的方法可能会出错:
[
{
key1: value,
key2: value,
},
{
key1: value,
key2: value,
},
.....
]
然后,使用 data [0] [“ name”] ,而不是 data [0] .name 除非我们强制转换为具有name属性的对象,否则不能使用 data [0] .name
我们为此data = json.decode(response.body).cast<ObjectName>();
ObjectName
可以是您想要的任何对象(内置或自定义)。但是请确保它具有他的名字属性
{
dataKey: [
{
key1: value1,
key2: value2,
}
]
}
然后json.decode
将返回地图,而不是列表
Map<String, dynamic> map = json.decode(response.body);
List<dynamic> data = data["dataKey"];
print(data[0]["name"]);
答案 6 :(得分:1)
这对我有用:
setState(){
Map<String, dynamic> map = json.decode(response.body);
Data = map["name"];
}
// for printing
Data[index]['name1'].toString(),
答案 7 :(得分:1)
如果您使用Firebase Cloud,请确保您不尝试添加具有相同DocumentID的多个数据;
firestore.collection('user').document(UNIQUEID).setData(educandos[0].toJson()).
答案 8 :(得分:0)
您必须将runtimeType
中的data
中的_InternalLinkedHashMap
转换为实际的List
。
一种方法是使用List.from
。
final _data = List<dynamic>.from(
data.map<dynamic>(
(dynamic item) => item,
),
);
答案 9 :(得分:0)
您正在尝试区分 InternalLinkedHashMap
的实例,但这是不可能的。
您应该序列化并将其反序列化回Map<String, dynamic>
。
InternalLinkedHashMap<String, dynamic> invalidMap;
final validMap =
json.decode(json.encode(invalidMap)) as Map<String, dynamic>;
答案 10 :(得分:-2)
使用json_annotation
,json_serializable
,build_runner
时出现相同的错误。当为具有类属性的类调用ClassName.fromJson()
方法时,就会发生这种情况(例如:class User具有属性类Address)。
作为解决方案,我修改了每个类生成的*.g.dart
文件,方法是在方法Map<String, dynamic>)
内部进行深层转换的任何地方,将Map<dynamic, dynamic>)
更改为_$*FromJson
< / p>
唯一的问题是,每次重新生成文件时,都必须再次更改它。