java - 如何在Retrofit2中从HashMap<String, Object>中提取数据?

标签 java android retrofit2

我在后端有 Spring Boot 项目,在前端有 Android 应用程序。两者之间的通信通过 Retrofti2 进行。 。实际上,在其中一个端点上 /login端点,正在重新调整 HashMap<String, Object> 。该端点如下所示:

@RequestMapping(value = "/login", method = RequestMethod.POST)
public ResponseEntity<?> login(@RequestBody AuthenticationRequest authenticationRequest) throws Exception {

    HashMap<String, Object> map = new HashMap<String, Object>();
    map.put("user", getUserObject());
    map.put("token", getJwtToken());

    return  ResponseEntity.ok(map);
}

方法调用的接口(interface)如下所示:

public interface LoginService {

    @POST("login")
    Call<HashMap<String, Object>> testLogin(@Body Login login); //login contains username and password strings
}

前端的响应如下所示:

Call<HashMap<String, Object>> call = mLoginService.testLogin(new Login(username, password));

call.enqueue(new Callback<HashMap<String, Object>>() {
    @Override
    public void onResponse(Call<HashMap<String, Object>> call, Response<HashMap<String, Object>> response) {
        if (!response.isSuccessful()){
            Toast.makeText(getApplicationContext(), "Wrong credentials!", Toast.LENGTH_SHORT).show();
            return;
        }

        //extract user & token
        HashMap<String, Object> map = response.body();

        Log.i("Test result", map.get("token").toString());
        Log.i("Test result", map.get("user").toString());

        User u = (User) map.get("user");

        //Toast.makeText(getApplicationContext(), "Welcome " + u.getUsername()   + "!", Toast.LENGTH_SHORT).show();


        startActivity(goToEmailsIntent);

    }

    @Override
    public void onFailure(Call<HashMap<String, Object>> call, Throwable t) {
        Toast.makeText(getApplicationContext(), "Cannot login, look at the console", Toast.LENGTH_SHORT).show();
        Log.i("ERRROOOOOOR during login", t.toString());
        return;
    }
});

当我查看控制台中的日志语句时,一切正常,我得到了我想要的数据。但是当尝试转换为 User 对象时,我遇到了异常。

java.lang.ClassCastException: com.google.gson.internal.LinkedTreeMap cannot be cast to com.example.email.model.User

如何解决这个问题?有没有更好的方法从后端发送用户对象和字符串?

最佳答案

第一种方法

当您可以更改后端服务时,请修改后端服务返回DTO而不是HashMap。

@RequestMapping(value = "/login", method = RequestMethod.POST)
public ResponseEntity<Token> login(@RequestBody AuthenticationRequest authenticationRequest) throws Exception {
    // create your response
    Token token = new Token();

    return  ResponseEntity.ok(token);
}

第二种方法

使用json格式来交换数据,在你的onResponse方法中你可以这样做:

HashMap<String, Object> map = response.body();
// map.get("user) may return a null value
String jsonString = new Gson().toJson(map.get("user));
User user = new Gson().fromJson(jsonString,User.class);

// do other thing as you want

关于java - 如何在Retrofit2中从HashMap<String, Object>中提取数据?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/61822781/

相关文章:

android - ShareActionProvider 在 showAsAction=ifRoom 时不起作用

android - 流音频文件,以便在Android中使用Google Drive API从Google Drive播放

java - Retrofit — 动态设置名称的多个同名查询参数

java - 使用 Retrofit2 在 Recycleview 中得到空响应?

android - 当数据是字符串而不是对象时,如何在 android 中使用解析相同的 json 响应?

java - 在继续 Android 之前等待 GPS 位置

java - 如何在java中安排一个 Action ?

java - 导出运行 JavaFX Scene3D 的 X Display

android - 空指针异常 : setinput function for Xmlpullparser assigning null value with StringReader

java - 在java中使用Restful api时如何提供用户名密码?