2017-08-22 69 views
0

我在Android Studio中遇到了关于如何请求JSON对象的问题。如何使用Android Volley显示/请求JSON对象?

我的Logcat只能打印字符串onResponse而不是JSONObject值。我遇到了一个问题,请尝试{}在AccessActivity.java中{}

我的代码说明如下。

我有这些JSON对象输出,我从MySQL数据库中获取。

{ 
    "access":"PA001", 
    "password":"123", 
    "fullname":"ARCADE", 
    "branch":"HQ", 
    "section":"MPR" 
} 

在我的PHP代码中,这是我如何获取数据并将其编码为JSON对象。

access.php

<?php 
    $conn = mysqli_connect("","","",""); 
    if(
     isset($_POST['access']) && 
     isset($_POST['password']) 
    ){ 
     $access  = $_POST['access']; 
     $password = $_POST['password']; 
     $sql = "SELECT * FROM table WHERE access = '$access' AND password = '$password' "; 
     $result = mysqli_query($conn, $sql); 
     if($result && mysqli_num_rows($result) > 0){ 
      while($row = mysqli_fetch_array($result)){ 

       $accessdb  = $row['access']; 
       $passworddb = $row['password']; 
       $fullnamedb = $row['fullname']; 
       $branchdb  = $row['branch']; 
       $sectiondb = $row['section']; 

       echo "success_access"; 

       $response = array('access' => $accessdb, 'password' => $passworddb, 'fullname' => $fullnamedb, 'branch' => $branchdb, 'section' => $sectiondb); 
       echo json_encode($response); 
      } 
     mysqli_free_result($result); 
     } else { 
      echo "access_failed"; 
     } 
    } 
?> 

但Android Studio中出现我的问题,

  1. 我甚至不能打印Log.e(TAG, “JSON对象=” +的JSONObject );
  2. 我无法将JSON对象值转换为下一个活动。

这是我的代码。

AccessActivity.java

public class AccessActivity extends AppCompatActivity{ 

    final String TAG = this.getClass().getName(); 
    EditText etAccess, etPassword; 
    Button bLogin; 

    @Override 
    protected void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.activity_login); 
     Toolbar toolbar = (Toolbar) findViewById(R.id.toolbar); 
     setSupportActionBar(toolbar); 

     etAccess  = (EditText)findViewById(R.id.etAccess); 
     etPassword  = (EditText)findViewById(R.id.etPassword); 
     bLogin   = (Button)findViewById(R.id.bLogin); 
     bLogin.setOnClickListener(new View.OnClickListener() { 
      @Override 
      public void onClick(View view) { 
       String url = "http://localhost/access.php"; 
       StringRequest stringRequest = new StringRequest(Request.Method.POST, url, new Response.Listener<String>() { 
        @Override 
        public void onResponse(String response) { 
         Log.e(TAG, "Response is = " + response); 
         if(response.equals("success_access")){ 
          try { 
           JSONObject jsonObject = new JSONObject(response); 
           Log.e(TAG, "JSON Object is = " + jsonObject); 

           final String accessdb = jsonObject.getString("access"); 
           final String passworddb = jsonObject.getString("password"); 
           final String fullnamedb = jsonObject.getString("fullname"); 
           final String branchdb = jsonObject.getString("branch"); 
           final String sectiondb = jsonObject.getString("branch"); 

           Intent intent = new Intent(AccessActivity.this, NextActivity.class); 
           intent.putExtra("access", accessdb); 
           intent.putExtra("password", passworddb); 
           intent.putExtra("fullname", fullnamedb); 
           intent.putExtra("branch", branchdb); 
           intent.putExtra("section", sectiondb); 
           AccessActivity.this.startActivity(intent); 
          } catch (JSONException e) { 
           e.printStackTrace(); 
          } 
         } else{ 
          Toast.makeText(getApplicationContext(), "Access Error", Toast.LENGTH_SHORT).show(); 
         } 
        } 
       }, new Response.ErrorListener() { 
        @Override 
        public void onErrorResponse(VolleyError error) { 
         Toast.makeText(getApplicationContext(), "Volley Error", Toast.LENGTH_SHORT).show(); 
        } 
       }){ 
        @Override 
        protected Map<String, String> getParams() throws AuthFailureError { 
         Map<String, String> params = new HashMap<>(); 
         params.put("access", etAccess.getText().toString()); 
         params.put("password", etPassword.getText().toString()); 
         return params; 
        } 
       }; 
       MySingleton.getInstance(getApplicationContext()).addToRequestQueue(stringRequest); 
      } 
     }); 
    } 
} 

UPDATE:

我logcat中显示此

08-22 10:22:22.059 19801-19908/com.apps.test D/NetworkSecurityConfig: No Network Security Config specified, using platform default 
08-22 10:22:22.064 19801-19801/com.apps.test E/my.com.apps.test.Activity: Response is = success_access{"access":"PA001","password":"123","fullname":"ARCADE","branch":"HQ","section":"HQ"} 
08-22 10:22:22.112 19801-19825/com.apps.test D/EGL_emulation: eglMakeCurrent: 0xb3305060: ver 2 0 (tinfo 0xb3303200) 
08-22 10:22:22.128 19801-19825/com.apps.test D/EGL_emulation: eglMakeCurrent: 0xb3305060: ver 2 0 (tinfo 0xb3303200) 
08-22 10:22:22.134 19801-19825/com.apps.test D/EGL_emulation: eglMakeCurrent: 0xb3305060: ver 2 0 (tinfo 0xb3303200) 
08-22 10:22:22.140 19801-19825/com.apps.test D/EGL_emulation: eglMakeCurrent: 0xb3305060: ver 2 0 (tinfo 0xb3303200) 
08-22 10:22:23.697 19801-19825/com.apps.test D/EGL_emulation: eglMakeCurrent: 0xb3305060: ver 2 0 (tinfo 0xb3303200) 
08-22 10:22:25.751 19801-19825/com.apps.test D/EGL_emulation: eglMakeCurrent: 0xb3305060: ver 2 0 (tinfo 0xb3303200) 
08-22 10:22:25.780 19801-19825/com.apps.test D/EGL_emulation: eglMakeCurrent: 0xb3305060: ver 2 0 (tinfo 0xb3303200) 

感激,如果有人可以帮我解决这个问题。谢谢。

+0

这将是真正的帮助,如果你可以添加你的logcat – ZeekHuge

+0

@ZeekHuge,我编辑了以上我的问题。 – AlotJai

回答

0

试试这个。

在AccessActivity

Intent intent = new Intent(AccessActivity.this, NextActivity.class); 
intent.putExtra("access", accessdb); 
intent.putExtra("password", passworddb); 
intent.putExtra("fullname", fullnamedb); 
intent.putExtra("branch", branchdb); 
intent.putExtra("section", sectiondb); 
AccessActivity.this.startActivity(intent); 

变化

LoginActivity.this.startActivity(intent); 

AccessActivity.this.startActivity(intent); 

在NextActivity

Intent intent = getIntent(); 
String access = intent.getStringExtra("access"); 
String password = intent.getStringExtra("password"); 
String fullname = intent.getStringExtra("fullname"); 
String branch = intent.getStringExtra("branch"); 
String section = intent.getStringExtra("section"); 

编辑

变化

if(response.equals("success_access")){ 
} 

if(response.contains("success_access")){ 
} 

,并根据您的代码。 您需要确保您当前的活动是com.apps.test.AccessActivitycom.apps.test.AccessActivity

编辑

变化

if (response.contains("success_access")) { 
     String res = response.substring(response.indexOf("{")); 
     try { 
      JSONObject jsonObject = new JSONObject(res); 
      final String accessdb = jsonObject.getString("access"); 
      final String passworddb = jsonObject.getString("password"); 
      final String fullnamedb = jsonObject.getString("fullname"); 
      final String branchdb = jsonObject.getString("branch"); 
      final String sectiondb = jsonObject.getString("branch"); 
      Log.e("Tag", accessdb); 

     } catch (JSONException e) { 
      e.printStackTrace(); 
     } 
} 
+0

感谢您的反馈。但它不起作用。 。 – AlotJai

+0

@AlotJai你可以显示·Log.e(标签,“JSON对象= =”+ jsonObject);·日志信息? – KeLiuyue

+0

nope。我无法在日志中显示jsonObject。 。我已经用我的logcat编辑了我的问题。 – AlotJai

0

你请求一个JSONObject? 您似乎掌握了StringRequest,所以生病让它简单。将您的StringRequest更改为JsonObjectRequest

0

问题:

正如你可以在你的logcat看到你从服务器得到的回应是success_access{"access":"PA001","password":"123","fullname":"ARCADE","branch":"HQ","section":"HQ"}

首先,这不是一个有效的JSON。 此外,这是response变量的值。 现在,您response.equals("success_access")永远不会返回true,因此代码控制将不会进入if块。

解决方案:

理想情况下,应该没有额外字符串等success_access,insted的你的反应应该是ALWAYS含有一个指定字段(result费尔德例如)JSON对象。要显示成功,你的JSON看起来像:

{ 
    result : "success_access", 
    /* other parameters down here */ 
} 

并在发生故障的情况下:

{ 
    result : "access_failed" 
} 

然后你的代码应respose字符串转换为JSON(服务器代码应该确保它始终返回有效的JSON)检查result字段的值,然后继续。

快速修复:

更改您的代码:

.... 
    Log.e(TAG, "Response is = " + response); 
    String result = response.replace("{.*}",""); 
    String jsonString = response.replace(result, ""); 

    if(result.equals("success_access")){ 
    try { 
      JSONObject jsonObject = new JSONObject(jsonString); 
    ....