json - 在 Flutter 中将 json 响应转换为对象的问题
问题描述
首先对我的“engrish”感到抱歉......我正在尝试在 Flutter 中使用带有 http 包的自己的 API 方法。我能够从 API 获得响应,但在尝试将响应 (json) 映射到名为 APILoginResponse 的自定义对象时遇到了麻烦。
我正在调用这样的 API 方法:
APILoginResponse apiLogin = await api.apiLogin();
但我收到运行时错误“动态不是 AccessToken 的子类型”。
这是我的 API 登录方法:
Future<APILoginResponse> apiLogin() async {
final http.Response response = await http.post(
api_end_point + '/api/Auth/login',
headers: <String, String>{
'Content-Type': 'application/json; charset=UTF-8',
},
body: jsonEncode(
<String, String>{'userName': api_user, 'password': api_password}),
);
if (response.statusCode == 200) {
return APILoginResponse.fromJson(json.decode(response.body));
} else {
throw Exception('Error en login de la API');
}
}
...这是我的 APILoginResponse 对象:
class APILoginResponse {
final AccessToken accessToken;
final String refreshToken;
APILoginResponse({this.accessToken, this.refreshToken});
factory APILoginResponse.fromJson(Map<String, dynamic> json) {
return APILoginResponse(
accessToken: json['accessToken'],
refreshToken: json['refreshToken'],
);
}
}
class AccessToken {
String token;
int expiresIn;
}
错误在行中:
accessToken: json['accessToken']
在 APILoginResponse 类中。
这是我的json回复:
{
"accessToken": {
"token": "eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJodHRwOi8vc2NoZW1hcy5taWNyb3NvZnQuY29tL3dzLzIwMDgvMDYvaWRlbnRpdHkvY2xhaW1zL3JvbGUiOiIiLCJzdWIiOiJib3N0b25jcmVkX2NsaWVudGVzIiwianRpIjoiZjBkMzY0ZDMtMmRkNS00NzkzLWE5ZTktMzY1YzJmODNiYmI3IiwiaWF0IjoxNTk0MTMxODAwLCJyb2wiOiJhcGlfYWNjZXNzIiwiaWQiOiIyMzg3YTMzZi1hYzE5LTRhMzYtODcyZC04MTE3MzExZDFjY2IiLCJuYmYiOjE1OTQxMzE3OTksImV4cCI6MTU5NDEzMjM5OSwiaXNzIjoid2ViQXBpIiwiYXVkIjoiaHR0cHM6Ly9sb2NhbGhvc3Q6NDQzMTcvLyJ9.PqCPkVct4e4duWFEr63fALZ0h_0x25vsV_GBx336Apw",
"expiresIn": 600
},
"refreshToken": "W6wyiw9xYuC2UaJmyCOYujKIZTs0jAscnfcWTrEyVIk="
}
对此的任何帮助将不胜感激。谢谢!
解决方案
如果你确定返回值是 anAccessToken
你可以试试这个:
factory APILoginResponse.fromJson(Map<String, dynamic> json) {
return APILoginResponse(
accessToken: (json['accessToken'] as Map<String,dynamic>) as AccessToken ?? null,
refreshToken: json['refreshToken'],
);
}
将您的 AccessToken 类更改为:
class AccessToken {
final Map<String,dynamic> tokenData;
AccessToken(tokenData)
}
推荐阅读
- javascript - getElementsByTagName 的错误用例?
- wordpress - 从后端 woocommerce 添加时立即共享产品
- python-3.x - Python - 列表索引必须是整数或切片,而不是 str
- php - 将文件写入新创建的文件夹时访问被拒绝
- ruby-on-rails - 设计令牌身份验证使用密码重置令牌查找用户
- ios - URL 图像不适用于 Swift Playgrounds 中的 UIButton
- swift - 如何在 Cocoa 应用程序中设置自定义标签顺序
- jbpm - 无法访问 jBPM 控制台
- java - Java Spring/Apache POI/THymeleaf - 从 MSWord 到 HTML 的格式化样式
- scala - 我们如何模拟具有泛型返回类型和隐式参数的 scala 方法?