android - _InternalLinkedHashMap' 不是类型 'List 的子类型
问题描述
void makeLoginReq() async {
String url = 'https://travel.prabidhee.com/api/login';
Map map = {
'email': email,
'password': password,
};
print(await apiRequest(url, map));
final response = await apiRequest(url, map);
print(response);
List<Map> reply = json.decode(response);
List<UserModelData> result = reply.map((item) => new UserModelData.fromJson(item)).toList();
print(result[0].accessToken);
}
Future<String> apiRequest(String url, Map jsonMap) async {
HttpClient httpClient = new HttpClient();
HttpClientRequest request = await httpClient.postUrl(Uri.parse(url));
request.headers.set('Accept', 'application/json');
request.headers.set('Content-type', 'application/json');
request.add(utf8.encode(json.encode(jsonMap)));
HttpClientResponse response = await request.close();
var reply = await response.transform(utf8.decoder).join();
httpClient.close();
print(reply);
return (reply);
}
}
这是远程服务器中登录请求的功能。登录后,json 响应被解码并存储在回复变量中。现在我想从响应中提取每个元素,如 access_token 、 token_type...。我怎样才能做到这一点 ?
解决方案
正如异常读取的那样,您的问题是您将地图转换为列表,这是不可能的。就像您不能将字符串转换为整数一样,或者您不能将雨虫视为马并骑着它到日落。
问题当然是为什么会发生这种情况:
该行json.decode(response)
返回一个映射,但您要分配此映射的变量可能只存储一个列表。
例如,如果您的响应如下所示:
{
"body": [
"Alisa",
"Alex",
"Boby",
"Monica"
]
}
然后你json.decode(response)
会是Map<String, List>("body" to ["Alisa", ...])
,所以身体被映射到名字。
假设您想将列表与其他 json 隔离开,您可以这样做,json.decode(response).get("body")
或者如果您的 json 看起来不同,您也可以通过调用json.decode(response).values()
or获取映射中的所有值或键json.decode(response).keys()
。
推荐阅读
- javascript - 如何动态显示数组数组?
- stenciljs - 模板对象属性未设置,当它们通过 HTML 字符串提供时
- css - 如何修复 IE 图像和列 flexbox 错误?
- tensorflow - 为什么使用 TensorRT 使用 INT8 推理输出更多数据
- php - ACF - 更新字段名称和键
- r - dplyr 中的 boxplot.stats 与组
- c++ - 问题:具有新类数据类型的二维向量(嵌套向量)
- c# - 将 IsWix 模板添加到 Visual Studio 2015
- polymer - Braintree 托管字段在 iframe 中不起作用
- java - 扩展 CrudRepository 并仍然使用 Spring Data JPA 为自定义方法创建自己的实现