【问题标题】:problem converting json response to object in Flutter在 Flutter 中将 json 响应转换为对象的问题
【发布时间】:2020-10-28 01:16:54
【问题描述】:

首先对我的“英语”感到抱歉... 我正在尝试在 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="
}

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

【问题讨论】:

    标签: json api flutter


    【解决方案1】:

    如果你确定返回值是AccessToken,你可以试试这个:

      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)
    }
    

    【讨论】:

    • 感谢 P4yam,不幸的是我的代码出现了同样的错误。
    • 是同样的错误吗? print(${json['accessToken']}) 显示什么?
    • {{令牌:eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJodHRwOi8vc2NoZW1hcy5taWNyb3NvZnQuY29tL3dzLzIwMDgvMDYvaWRlbnRpdHkvY2xhaW1zL3JvbGUiOiIiLCJzdWIiOiJib3N0b25jcmVkX2NsaWVudGVzIiwianRpIjoiZjQxNWJlMWEtNTgyZC00ZGY3LTgzOGItNDljYTdkZGJiNGNiIiwiaWF0IjoxNTk0MTQ1MTYwLCJyb2wiOiJhcGlfYWNjZXNzIiwiaWQiOiIyMzg3YTMzZi1hYzE5LTRhMzYtODcyZC04MTE3MzExZDFjY2IiLCJuYmYiOjE1OTQxNDUxNjAsImV4cCI6MTU5NDE0NTc2MCwiaXNzIjoid2ViQXBpIiwiYXVkIjoiaHR0cHM6Ly9sb2NhbGhvc3Q6NDQzMTcvLyJ9.bQLG-31ggBBsrz-7T6n5cIlwiBpaSoHrdfxla4-VaxQ,expiresIn:600}} 跨度>
    • 我编辑了我原来的原始帖子并添加了来自 API 的 json 响应
    • accessToken 的类型是Map&lt;String,dynamic&gt;。我编辑我的答案。看看是否有效
    【解决方案2】:

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

    class APILoginResponse {
      AccessToken accessToken;
      String refreshToken;
    
      APILoginResponse({this.accessToken, this.refreshToken});
    
      APILoginResponse.fromJson(Map<String, dynamic> json) {
        accessToken = json['accessToken'] != null
            ? new AccessToken.fromJson(json['accessToken'])
            : null;
        refreshToken = json['refreshToken'];
      }
    
      Map<String, dynamic> toJson() {
        final Map<String, dynamic> data = new Map<String, dynamic>();
        if (this.accessToken != null) {
          data['accessToken'] = this.accessToken.toJson();
        }
        data['refreshToken'] = this.refreshToken;
        return data;
      }
    }
    
    class AccessToken {
      String token;
      int expiresIn;
    
      AccessToken({this.token, this.expiresIn});
    
      AccessToken.fromJson(Map<String, dynamic> json) {
        token = json['token'];
        expiresIn = json['expiresIn'];
      }
    
      Map<String, dynamic> toJson() {
        final Map<String, dynamic> data = new Map<String, dynamic>();
        data['token'] = this.token;
        data['expiresIn'] = this.expiresIn;
        return data;
      }
    }
    

    现在一切正常!谢谢!

    【讨论】:

      猜你喜欢
      • 2019-03-30
      • 2017-10-17
      • 2018-07-26
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-02-16
      • 2021-08-27
      • 1970-01-01
      相关资源
      最近更新 更多