_InternalLinkedHashMap <string,dynamic =“”>'不是'List <map <dynamic,dynamic =“” >>'类型的子类型

时间:2018-10-30 11:35:42

标签: android json android-studio flutter jsonparser

    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响应将解码并存储在reply变量中。现在,我想从响应中提取每个元素,例如access_token,token_type...。我怎样才能做到这一点 ?

Debugger

1 个答案:

答案 0 :(得分:1)

正如异常所示,您遇到的问题是您正在将地图投射到列表中,这是不可能的。就像您无法将String转换为整数一样,或者您也无法将Rainworm视为一匹马并骑上它直到日落。
当然,问题是为什么会这样:
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()或{{ 1}}。