【问题标题】:Comparing values from textviews and JSONArray比较来自 textviews 和 JSONArray 的值
【发布时间】:2014-07-31 18:20:58
【问题描述】:

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

我想让用户通过输入用户名和密码来登录应用程序,这个用户名和密码必须与我从 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 中搜索我从 textviews 中检索到的值。

如果可能,我想检索一个可以轻松分配给 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;

}
}

【问题讨论】:

    标签: java android json getjson arrays


    【解决方案1】:

    两件事:

    • 看看GSON。它是一个谷歌库,用于将对象编码为 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);
    
    • 听起来您正在以原始文本形式存储用户名和密码,并以原始文本形式从数据库中检索它们。这是一个非常糟糕的主意!密码应始终以加密形式(即散列)存储。当用户提供登录密码时,您对提供的密码进行加密并比较加密版本(即将提供的密码的哈希值与数据库中存储的哈希值进行比较)。这可以防止可能正在监听您的网络流量的人获取您的密码。相反,如果他们正在监视您的网络流量,他们会看到经过哈希处理的密码,并且在不确切知道用​​于哈希密码的算法的情况下,他们将无法计算原始密码。

    【讨论】:

      【解决方案2】:

      您的代码需要在 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;
          }
      }
      

      【讨论】:

      • 我确实为 asynctask 创建了一个新类,对吧?我是否按原样运行代码?因为我有一些额外的代码用于获取 json 数据。谢谢
      • @dkgeld 是的,像这样运行它,我省略了 toast,我们可以稍后添加它们
      • 我正在尝试,但我不知道该怎么做。
      【解决方案3】:

      在这里找到了一个非常简单且中肯的教程:

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

      感谢@meda 的所有帮助 :)

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2017-10-04
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多