我在获取对象内的数组时遇到问题。我正在使用带有 NodeJS/Express 后端的 Android Studio 和 Java。我正在尝试取回用户角色,以便我可以将用户重定向到正确的片段。
这是我的登录模型
package com.example.vmsandroid;
import java.util.List;
import com.google.gson.annotations.Expose;
import com.google.gson.annotations.SerializedName;
public class Login {
@SerializedName("user")
@Expose
private List<User> user = null;
public List<User> getUser() {
return user;
}
public void setUser(List<User> user) {
this.user = user;
}
}
这是我的用户模型
package com.example.vmsandroid;
import com.google.gson.annotations.Expose;
import com.google.gson.annotations.SerializedName;
public class User {
@SerializedName("role")
@Expose
private String role;
@SerializedName("username")
@Expose
private String username;
public String getRole() {
return role;
}
public void setRole(String role) {
this.role = role;
}
public String getUsername() {
return username;
}
public void setUsername(String username) {
this.username = username;
}
}
这是我的改造实例:
retrofit = new Retrofit.Builder()
.baseUrl(BASE_URL)
.addConverterFactory(GsonConverterFactory.create())
.client(okHttpClient)
.build();
retrofitInterface = retrofit.create(RetrofitInterface.class);
这是我的 API 调用
@POST("/app/login")
Call<Login> executeLogin(@Body HashMap<String, String> map);
这是我的 ExpressJS POST 请求
accountRoutes.post('/app/login', function(req,res){
var matched_users_promise = models.user.findAll({
where: Sequelize.and(
{username: req.body.username},
)
});
matched_users_promise.then(function(users){
if(users.length > 0){
let user = users[0];
let passwordHash = user.password;
const userArray = [];
if(bcrypt.compareSync(req.body.password, passwordHash)){
client.select("role","username").from("users").where( { username: req.body.username }).then(data =>{
res.status(200).send(JSON.stringify({user:data}));
console.log(data);
})
// console.log(rolequery.role);
// res.status(200).send(JSON.stringify(objToSend))
}
else{
res.status(404).send();
}
}
else{
res.status(404).send();
}
});
});
我的 onResponse 和 onFailure
private void handleLoginDialog() {
View view = getLayoutInflater().inflate(R.layout.login, null);
AlertDialog.Builder builder = new AlertDialog.Builder(this);
builder.setView(view).show();
Button loginBtn = view.findViewById(R.id.login);
EditText usernameedit = view.findViewById(R.id.username);
EditText passwordedit = view.findViewById(R.id.password);
loginBtn.setOnClickListener(new View.OnClickListener(){
@Override
public void onClick(View view) {
HashMap<String, String> map = new HashMap<>();
map.put("username", usernameedit.getText().toString());
map.put("password", passwordedit.getText().toString());
Call<Login> call = retrofitInterface.executeLogin(map);
call.enqueue(new Callback<Login>() {
@Override
public void onResponse(Call<Login> call, Response<Login> response) {
if (response.code() == 200){
// startActivity(new Intent(getApplicationContext(),MainMenu.class));
// AlertDialog.Builder builder1 = new AlertDialog.Builder(MainActivity.this);
// builder1.setTitle(loginresult.getRole());
// builder1.setMessage(loginresult.getUsername());
// builder1.show();
Toast.makeText(MainActivity.this, "role"+ response.body().getUser(), Toast.LENGTH_SHORT).show();
}
if (response.code() ==404){
Toast.makeText(MainActivity.this, "Invalid Username or Password", Toast.LENGTH_SHORT).show();
}
}
@Override
public void onFailure(Call<Login> call, Throwable t) {
Toast.makeText(MainActivity.this, "error" + t.getMessage(), Toast.LENGTH_SHORT).show();
}
});
}
});
}
登录后,这是我从 HTTPinterceptor 获得的 JSON 响应。
{"user":[{"role":"Tenant", "username":"edvin"}]}
出于某种原因,这就是 Toast 发回的内容。
role:com.example.vmsandroid.User@edbe883
“edbe833”总是不同的和随机的。
非常感谢帮助,已经连续研究了 2 天,但仍然找不到解决方案。如果还有什么需要我提供的,请告诉我
答案 0 :(得分:1)
哈哈。在发布此内容 5 分钟后,我找到了解决方案。对于像我一样也有问题的人,这里是解决方案。
将 response.body().getUser()
更改为 response.body().getUser().get(0).getRole()
。
答案 1 :(得分:0)
对不起我的英语
请重写数据类User中的toString方法
因为在 toast 中使用了 '+',所以调用 toString 转换为 String obj
所以它调用了Object类的toString方法
就这些