как решить проблему не входя в блок Try в андроид студии? - PullRequest
0 голосов
/ 20 июня 2019

Я занимаюсь разработкой приложения для Android. На самом деле, моя база данных находится на локальном хосте. Я разработал свой API с использованием PHP. для страницы входа в Android Studio, мне нужно проверить, правильно ли введены учетные данные пользователя или нет. Я сталкиваюсь с проблемой, когда хочу десериализовать json, полученный из API; проблема, не входящая в блок Try! не могли бы вы проверить это и написать мне, каково решение?

Я проверил, работает ли мой API, и я правильно понял, json; это json от одной из моих попыток входа в систему:

{"status":"success","user_count":1,"user":{"id":"2","username":"yasi","password":"yasi"}}

Сначала я поставил команду «Журнал» в своем классе, чтобы проверить, вызывается ли класс и запускается; он запускается, но игнорирует блок 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());
    }
}

Я ожидаю, что следующая активность будет показана, если я введу правильные учетные данные для входа в систему.

Прежде всего, я работаю над фрагментом, а не над деятельностью.

во-вторых, это код для вызова моего API в OnCreateView ():

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 голосов
/ 20 июня 2019

Используйте Gson для лучшего и оптимизированного кода

Добавить зависимость Gson в Gradle:

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, а не ручной.

0 голосов
/ 20 июня 2019

Вы обращаетесь к имени пользователя напрямую, но оно находится в объекте пользователя. Итак, сначала получите объект пользователя, затем попытайтесь получить имя пользователя и другие файлы.

JSONObject jsonObject=new JSONObject(jsonUser);
JSONObject jsonObjectUser=jsonObject.getJSONObject("user");

username = jsonObjectUser.getString("username");
password = jsonObjectUser.getString("password");
user_count=jsonObjectUser.getString("user_count");
0 голосов
/ 20 июня 2019

Ваш 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 просто «ноль». (Не уверен, что это потому, что сообщения нет, или потому что сообщение на самом деле говорит «ноль», но эффект тот же.) NPE очень распространены, и «ноль» редко бывает полезным сообщением об ошибке, поэтому вы должны всегда выведите хотя бы тип исключения, или позвоните printStackTrace, или просто передайте все исключение регистратору, который обычно с ним поступит правильно.

...