在颤振中将json响应转换为对象时出现问题

在颤振中将json响应转换为对象时出现问题,json,api,flutter,Json,Api,Flutter,首先对我的“英语”感到抱歉。。。 我正试图在Flutter中使用自己的带有http包的API方法。 我能够从API获得响应,但在尝试将响应(json)映射到名为APILoginResponse的自定义对象时遇到了问题 我这样调用API方法: APILoginResponse apiLogin = await api.apiLogin(); 但我得到一个运行时错误“dynamic不是AccessToken的子类型” 以下是我的API登录方法: Future apiLogin()异步{ final

首先对我的“英语”感到抱歉。。。 我正试图在Flutter中使用自己的带有http包的API方法。 我能够从API获得响应,但在尝试将响应(json)映射到名为APILoginResponse的自定义对象时遇到了问题

我这样调用API方法:

APILoginResponse apiLogin = await api.apiLogin();
但我得到一个运行时错误“dynamic不是AccessToken的子类型”

以下是我的API登录方法:

Future apiLogin()异步{
final http.Response Response=wait http.post(
api_end_point+'/api/Auth/login',
标题:{
“内容类型”:“应用程序/json;字符集=UTF-8”,
},
正文:JSONECODE(
{'userName':api_用户,'password':api_密码}),
);
如果(response.statusCode==200){
返回APILoginResponse.fromJson(json.decode(response.body));
}否则{
抛出异常('Error en login de la API');
}
}
…这是我的APILoginResponse对象:

class APILoginResponse{
最终AccessToken AccessToken;
最终字符串刷新标记;
APILoginResponse({this.accessToken,this.refreshtToken});
factory APILoginResponse.fromJson(映射json){
返回APILoginResponse(
accessToken:json['accessToken'],
refreshToken:json['refreshToken'],
);
}
}
类访问令牌{
字符串标记;
呼气素;
}
错误在以下行中:

accessToken: json['accessToken']
在APILoginResponse类内部

以下是我的json响应:

{
“accessToken”:{
“代币”:"2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2 XMZE3Otksimv4cci6mtu5ndezmjm5oswiaxnzijoid2viqxbpiwiyxvkijoiahr0chm6y9sb2nhbghvc3q6ndqzmtcvlyj9.PqCPkVct4e4duWFEr63fALZ0h_0x25vsV_GBx336Apw“,
“过期蛋白”:600
},
“refreshToken”:“W6wyiw9xYuC2UaJmyCOYujKIZTs0jAscnfcWTrEyVIk=”
}

如果您确定返回值是一个
AccessToken
,您可以尝试以下操作:

  factory APILoginResponse.fromJson(Map<String, dynamic> json) {
   return APILoginResponse(
   accessToken: (json['accessToken'] as Map<String,dynamic>) as AccessToken ?? null,
   refreshToken: json['refreshToken'],
   );
 }
factory APILoginResponse.fromJson(映射json){
返回APILoginResponse(
accessToken:(json['accessToken']作为映射)作为accessToken??null,
refreshToken:json['refreshToken'],
);
}
将AccessToken类更改为:

class AccessToken {
   final Map<String,dynamic> tokenData;
   AccessToken(tokenData)
}
类访问令牌{
最终地图数据;
AccessToken(令牌数据)
}

我认为@P4yam的答案是正确的,但我一次又一次地遇到同样的错误,所以我更改了我的APILoginResponse类,如下所示:

class APILoginResponse{
AccessToken AccessToken;
字符串刷新令牌;
APILoginResponse({this.accessToken,this.refreshtToken});
APILoginResponse.fromJson(映射json){
accessToken=json['accessToken']!=null
?新的AccessToken.fromJson(json['AccessToken'])
:null;
refreshToken=json['refreshToken'];
}
映射到JSON(){
最终地图数据=新地图();
if(this.accessToken!=null){
数据['accessToken']=this.accessToken.toJson();
}
数据['refreshToken']=this.refreshToken;
返回数据;
}
}
类访问令牌{
字符串标记;
呼气素;
AccessToken({this.token,this.expiresIn});
AccessToken.fromJson(映射json){
token=json['token'];
expiresIn=json['expiresIn'];
}
映射到JSON(){
最终地图数据=新地图();
数据['token']=this.token;
数据['expiresIn']=this.expiresIn;
返回数据;
}
}

现在一切都正常了!谢谢!

谢谢P4yam,不幸的是,我在您的代码中遇到了相同的错误。这是相同的错误吗?
打印(${json['accessToken']})
显示了什么{2.我的研究工作是一种新的vvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvwwwwwwwwwwwwwwwwwwwwwwwwvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwOtqxNduxNjasiMV4Cci6mtu5nde0ntc2McWiaxijijoid2viqxBpiiwiyxVkijoiahr0chm6ly9sb2nhbghvc3q6ndqzmtcvlyj9.bQLG-31ggBBsrz-7T6n5cIlwiBpaSoHrdfxla4-VaxQ,expiresIn:600}我编辑了我原来的帖子,并添加了来自APIJson的json响应,
accessToken
的类型是
Map
。我编辑了我的答案。看看是否行得通