Je développe une application Android. en fait, ma base de données est sur localhost. J'ai développé mon API en utilisant PHP. pour la page de connexion dans android studio, je dois vérifier si les informations de connexion de l'utilisateur sont correctes ou non. Je suis confronté à un problème lorsque je veux désérialiser le json que j'ai obtenu de l'API; le problème de ne pas entrer dans le bloc Try! pourriez-vous le vérifier et m'écrire quelle est la solution?

J'ai vérifié si mon API fonctionne et j'obtiens le bon json; ceci est un json de l'une de mes tentatives de connexion:

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

J'ai mis une commande "Log" au début de ma classe pour vérifier si la classe est appelée et démarre; il démarre mais ignore le bloc Try et passe au bloc 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());
    }
}

Je m'attends à ce que la prochaine activité soit affichée si j'entre les informations de connexion d'utilisateur correctes.

Tout d'abord, je travaille sur un Fragment et non sur une Activité.

Deuxièmement, voici le code pour appeler mon API dans 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
Yasi.Aap 20 juin 2019 à 15:32

3 réponses

Meilleure réponse

Votre JSON a cette structure:

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

Donc cette ligne

username = jsonObject.getString("username");

Ne va pas retourner "yasi" comme vous vous y attendez probablement, car "username" est un champ de "user", pas de l'objet de niveau supérieur. Il va soit lancer une exception, soit retourner null, auquel cas le code qui vérifie si username est "admin" lèvera une exception. Quoi qu'il en soit, vous vous retrouvez dans la prise.

Le simple fait d'imprimer le résultat de getMessage() lorsque vous détectez une exception n'est généralement pas une bonne idée car le "message" pour NullPointerException est simplement "null". (Je ne sais pas si c'est parce qu'il n'y a pas de message, ou parce que le message dit en fait "null", mais l'effet est le même.) Les NPE sont très courants et "null" est rarement un message d'erreur utile, vous devriez donc toujours affichez au moins le type d'exception, ou appelez printStackTrace, ou transmettez simplement l'exception entière à l'enregistreur, qui fera généralement ce qu'il faut.

0
Willis Blackburn 20 juin 2019 à 12:52

Utilisez Gson pour un code optimal et optimisé

Ajouter la dépendance Gson dans gradle:

implementation 'com.google.code.gson:gson:2.8.5'

Maintenant, ajoutez deux classes de modèle dans le projet

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;
    }

}

Et 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;
    }

}

Remplacez maintenant la désérialisation json par ceci

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());
        }
    }

C'est un moyen optimisé et meilleur pour effectuer une analyse json plutôt qu'une analyse manuelle.

0
Karan Khurana 20 juin 2019 à 13:00

Vous accédez directement au nom d'utilisateur, mais il se trouve dans l'objet utilisateur. Alors commencez par obtenir un objet utilisateur, puis essayez d'obtenir le nom d'utilisateur et d'autres fieilds.

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
Asif Patel 20 juin 2019 à 13:02