我正在尝试从服务器获取 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!";
}
Run Code Online (Sandbox Code Playgroud)
未处理的异常:类型“_InternalLinkedHashMap<String, dynamic>”不是“List”类型的子类型
可能是什么原因?
Diy*_*ang 90
以下是可能出错的两种常见方式:
如果您的响应是一个 json 对象,例如
[
{
key1: value1,
key2: value2,
key3: value3,
},
{
key1: value1,
key2: value2,
key3: value3,
},
.....
]
Run Code Online (Sandbox Code Playgroud)
然后,我们使用data[0]["name"], notdata[0].name
除非我们转换为具有 name 属性的对象,否则我们不能使用data[0].name
我们这样投 data = json.decode(response.body).cast<ObjectName>();
ObjectName可以是您想要的任何对象(内置或自定义)。但请确保它具有 name 属性
如果您的响应是一个 JSON 对象,例如
{
dataKey: [
{
key1: value1,
key2: value2,
key3: value3,
}
]
}
Run Code Online (Sandbox Code Playgroud)
然后json.decode将返回一个Map,而不是一个List
Map<String, dynamic> map = json.decode(response.body);
List<dynamic> data = map["dataKey"];
print(data[0]["name"]);
Run Code Online (Sandbox Code Playgroud)AKA*_*ANI 48
您可以使用
new Map<String, dynamic>.from(snapshot.value);
erl*_*man 19
您正在尝试处理一个InternalLinkedHashMap不可能的实例。
您应该将其序列化并反序列化回Map<String, dynamic>.
InternalLinkedHashMap<String, dynamic> invalidMap;
final validMap =
json.decode(json.encode(invalidMap)) as Map<String, dynamic>;
Run Code Online (Sandbox Code Playgroud)
Par*_*iya 15
由于不会改变类型,它只是一个断言。
您需要使用:
map['eventType'].cast<String, dynamic>() 或者
Map<String, dynamic>.from(map['eventType'])
也可以这样解决:
Map<String, dynamic> myMap = Map<String, dynamic>.from(/*Your Source*/ );
Run Code Online (Sandbox Code Playgroud)
小智 7
最简单的方法(一维):
Map<String, dynamic> data = new Map<String, dynamic>.from(json.decode(response.body));
print(data['name']);
Run Code Online (Sandbox Code Playgroud)
您必须将runtimeTypeof datafrom_InternalLinkedHashMap转换为实际List.
一种方法是使用List.from.
final _data = List<dynamic>.from(
data.map<dynamic>(
(dynamic item) => item,
),
);
Run Code Online (Sandbox Code Playgroud)
如果您需要使用通用字段,有一个解决方法:
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()
);
}
}
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
130740 次 |
| 最近记录: |