比较textviews和JSONArray的值

时间:2014-07-31 18:20:58

标签: java android json getjson arrays

对于(看似)懒惰的问题感到抱歉,但我一直在寻找一个没有运气的解决方案(换句话说,我还没有找到我理解的解决方案)。

我想让用户通过输入用户名和密码登录到应用程序,此用户名和密码必须与我从phpmyadmin数据库中检索到的jsonarray中的用户名和密码相匹配。用户名和密码必须在同一行。

这是我用来检索jsonarray的函数:

private void getData(){

JSONArray json;
try{
    user = editText1.getText().toString();
    password = editText2.getText().toString();

    json = readJsonFromUrl("http://localhost/indextest.php?function=getdata");

       Thread.sleep(1000);
  } catch (Exception e) {
    Log.e("BACKGROUND_PROC", e.getMessage());
  }

}

我只需要知道如何在jsonarray中搜索从文本视图中检索的值。

如果可能,我想检索一个我可以轻松分配给if语句的值:

public void onClick(View v) {

        switch (v.getId()) {
            case R.id.button1:

                if  ( editText1 != null && editText1.length() != 0 && editText2 != null && editText2.length() != 0){    
                    getData();
                    m_ProgressDialog = ProgressDialog.show(HomeScreen.this,    
                              "Please wait...", "Checking Details...", true);
                        m_ProgressDialog.setCancelable(true);

                      if ( /*username and password match*/){
                      Intent i = new Intent(this, Afterlog.class);
                      startActivity(i);     
                      }

                    else{
                        Toast.makeText(HomeScreen.this, "The username and password did not match any in our database...", Toast.LENGTH_SHORT).show();   
                    }
                }
                else {
                    Toast.makeText(HomeScreen.this, "Please enter a user name AND a password...", Toast.LENGTH_SHORT).show();
                }
                break;

}
}

3 个答案:

答案 0 :(得分:0)

两件事:

  • 看看GSON。它是一个Google库,用于将对象编码为json,然后将json解码为对象。实质上,您可以定义一个类,该结构与您在JSON中接收的数据具有相同的结构,然后使用GSON读取JSON并使用填充的相应字段创建类的对象。您的代码看起来像这样:

首先,为要发送的数据定义您的类结构为JSON:

public class LoginData {
    public String Username; //These identifiers must match the JSON structure
    public String HashedPassword;

    public LoginData(String username, String hashedPass) {
        Username = username;
        HashedPassword = hashedPass;
    }
}

然后,一旦收到JSON,就可以解析如下信息:

LoginData login = mGson.fromJson(json, LoginData.class);
  • 听起来您正在以原始文本存储用户名和密码,并以原始文本从数据库中检索它们。这是一个非常糟糕的想法!密码应始终以加密形式存储(即散列)。当用户提供其登录密码时,您将加密提供的密码并比较加密版本(即将提供的密码的哈希值与数据库中存储的哈希值进行比较)。这可以防止可能正在侦听您的网络流量的人捕获您的密码。相反,如果他们正在观察您的网络流量,他们会看到哈希密码,并且不知道用于散列密码的确切算法,他们将无法计算原始密码。

答案 1 :(得分:0)

您的代码需要在asyncTask中运行,因为它正在执行网络请求:

以下是一个例子:

class LoginTask extends AsyncTask<String, String, JSONObject>
{
    protected JSONObject doInBackground(String... urls)
    {

        return readJsonFromUrl(urls[0]);
    }

    protected void onPostExecute(JSONObject result)
    {

      try {
        //this assumes that the response looks like this:
        //{"username" : "john" , "password" : "Bsd6578" }
         String responseUsername = result.getString("username");   
         String responsePassword = result.getString("password"); 

         if (user.equals(responseUsername) && password.equals(responsePassword)){
            Intent i = new Intent(this, Afterlog.class);
            startActivity(i);     
         }else{
            Log.d("mylog", "username and password dont match");
         }

       } catch (JSONException e) {
         // TODO Auto-generated catch block
         e.printStackTrace();
       }
    }
}

您的按钮应负责运行该任务:

public void onClick(View v) {
    switch (v.getId()) {
        case R.id.button1:
          user = editText1.getText().toString();
          password = editText2.getText().toString();
          new LoginTask().execute()
        break;
    }
}

答案 2 :(得分:0)

在这里找到一个非常简单的点教程:

http://www.coderzheaven.com/2012/04/22/create-simple-login-form-php-android-connect-php-android/

感谢@meda的所有帮助:)