我正在开发一个android应用程序。实际上,我的数据库位于localhost上。我已经使用PHP开发了我的API。对于android studio中的登录页面,我需要检查用户登录凭据是否正确。当我想反序列化从API获得的json时遇到一个问题;无法进入Try块的问题!请检查一下并为我写解决方案吗?
我检查了我的API是否正常工作,并且得到了正确的json;这是我登录尝试之一的json:
{"status":"success","user_count":1,"user":{"id":"2","username":"yasi","password":"yasi"}}
我在班级的开头放置了一个“ Log”命令,以检查该班级是否被调用并开始;它开始但忽略Try块,然后转到Catch块。
public void jsonToUser (String jsonUser){
String username,password,user_count;
try {
JSONObject jsonObject=new JSONObject(jsonUser);
username = jsonObject.getString("username");
password = jsonObject.getString("password");
user_count=jsonObject.getString("user_count");
if(user_count.equals("1"))
{
if (!username.equals("admin"))
{
Intent intent = new Intent(getActivity(), HomePageActivity.class);
startActivity(intent);
}
else
{
Intent intent = new Intent(getActivity(), AdminHomePageActivity.class);
startActivity(intent);
}
}
else
Toast.makeText(getActivity(),"User not Found",Toast.LENGTH_LONG).show();
}
catch (JSONException e){
Log.d("error",e.getMessage());
}
}
如果我输入正确的用户登录凭据,我希望显示下一个活动。
首先,我正在处理一个片段而不是一个活动。
第二,这是在OnCreateView()中调用我的API的代码:
btnLogin.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
new CheckUserLoginAsync().execute("http://10.0.2.2:80/whereToEatAPI/api/check_user_login_api.php"
,txtUsername.getText().toString()
,txtPassword.getText().toString());
答案 0 :(得分:0)
您的JSON具有以下结构:
{
"status":"success",
"user_count":1,
"user": {
"id":"2",
"username":"yasi",
"password":"yasi"
}
}
所以这行
username = jsonObject.getString("username");
不会像您预期的那样返回“ yasi”,因为“ username”是“ user”的字段,而不是顶级对象的字段。它要么引发异常,要么返回null,在这种情况下,检查username
是否为“ admin”的代码将引发异常。不管哪种方式,您都会陷入困境。
在捕获到异常时仅打印getMessage()
的结果通常不是一个好主意,因为NullPointerException
的“消息”只是“空”。 (不确定这是因为没有消息,还是因为消息实际上说“ null”,但是效果是一样的。)NPE很常见,“ null”很少是有用的错误消息,因此您应该始终至少打印异常类型,或调用printStackTrace
,或仅将整个异常传递给记录器,这通常会做正确的事情。
答案 1 :(得分:0)
使用Gson获得最佳和优化的代码
在gradle中添加Gson依赖项:
implementation 'com.google.code.gson:gson:2.8.5'
现在在项目中添加两个模型类
Login.class
public class Login {
@SerializedName("status")
@Expose
private String status;
@SerializedName("user_count")
@Expose
private Integer userCount;
@SerializedName("user")
@Expose
private User user;
public String getStatus() {
return status;
}
public void setStatus(String status) {
this.status = status;
}
public Integer getUserCount() {
return userCount;
}
public void setUserCount(Integer userCount) {
this.userCount = userCount;
}
public User getUser() {
return user;
}
public void setUser(User user) {
this.user = user;
}
}
和 User.class
public class User {
@SerializedName("id")
@Expose
private String id;
@SerializedName("username")
@Expose
private String username;
@SerializedName("password")
@Expose
private String password;
public String getId() {
return id;
}
public void setId(String id) {
this.id = id;
}
public String getUsername() {
return username;
}
public void setUsername(String username) {
this.username = username;
}
public String getPassword() {
return password;
}
public void setPassword(String password) {
this.password = password;
}
}
现在用
替换json反序列化public void jsonToUser (String jsonUser){
String username,password,user_count;
try {
Gson gson = new Gson();
Login login =gson.fromJson(jsonUser, Login.class);
username = login.getUser().getUsername();
user_count = String.valueOf(login.getUserCount());
password = login.getUser().getPassword();
if(user_count.equals("1"))
{
if (!username.equals("admin"))
{
Intent intent = new Intent(getActivity(), HomePageActivity.class);
startActivity(intent);
}
else
{
Intent intent = new Intent(getActivity(), AdminHomePageActivity.class);
startActivity(intent);
}
}
else
Toast.makeText(MainActivity.this,"User not Found",Toast.LENGTH_LONG).show();
}
catch (Exception e){
Log.e("error",e.getMessage());
}
}
这是一种进行json解析而不是手动解析的优化且更好的方法。
答案 2 :(得分:0)
您正在直接访问用户名,但是它在用户对象中。因此,首先获取用户对象,然后尝试获取用户名和其他字段。
JSONObject jsonObject=new JSONObject(jsonUser);
JSONObject jsonObjectUser=jsonObject.getJSONObject("user");
username = jsonObjectUser.getString("username");
password = jsonObjectUser.getString("password");
user_count=jsonObjectUser.getString("user_count");