首页 > 解决方案 > 在 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="
}

对此的任何帮助将不胜感激。谢谢!

标签: jsonapiflutter

解决方案


如果你确定返回值是 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)
}

推荐阅读