如何解决在Android Studio中不输入Try块的问题?

时间:2019-06-20 12:32:28

标签: java json json-deserialization

我正在开发一个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());

3 个答案:

答案 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");