2016-07-04 106 views
0

嗨,我有這個問題檢索數據,即時通訊使用android volley和json從Web服務器獲取數據。類型java.lang.String無法轉換爲Response.Listener上的JSONObject

繼承人我的PHP文件:

<?php 
    $con = mysqli_connect("***", "***", "***", "***"); 

    // listing input entries for query 
    $city = $_POST["city"]; 
    $term = $_POST["term"]; 
    $p_type = $_POST["property_type"]; 
    $min = $_POST["price_min"]; 
    $max = $_POST["price_max"]; 
    $bedrooms = $_POST["bedrooms"]; 
    $bathrooms = $_POST["bathrooms"]; 

    $query = "SELECT * FROM listing WHERE city = ? AND term = ? AND property_type = ? AND bedrooms = ? AND bathrooms = ? 
    AND price BETWEEN ? AND ?"; 

    $statement = mysqli_prepare($con, $query); 
    mysqli_bind_param($statement, "sssiiii", $city, $term, $p_type, $bedrooms, $bathrooms, $min, $max); 
    mysqli_stmt_execute($statement); 

    mysqli_stmt_store_result($statement); 
    mysqli_stmt_bind_result($statement, $p_id, $p_name, $p_type, $term, $city, $address, $lot_area, $floor_area, $price, 
     $bedrooms, $bathrooms, $host_name, $host_contact_no, $host_details, $date_listed, $user_id); 

    $count = mysqli_stmt_num_rows($statement); 
    mysqli_stmt_close($statement); 

    $response = array(); 
    $response["hasData"] = false; 

    if($count > 0){ 
     $response["hasData"] = true; 
     while(mysqli_stmt_fetch($statement)){ 
      $response["property_name"]= $p_id; 
      $response["property_type"] = $p_type; 
      $response["term"] = $term; 
      $response["city"] = $city; 
      $response["address"] = $address; 
      $response["lot_area"] = $lot_area; 
      $response["floor_area"] = $floor_area; 
      $response["price"] = $price; 
      $response["bedroom"] = $bedroom; 
      $response["bathroom"] = $bathroom; 
      $response["host_name"] = $host_name; 
      $response["host_contact_no"] = $host_contact_no; 
      $response["host_details"] = $host_details; 
      $response["date_listed"] = $date_listed; 
     } 

    }else{ 
     $response["hasData"] = false; 
    } 

    echo json_encode($response); 
?> 

我有一個Java類名searchListingRequest.java

public class SearchListingRequest extends StringRequest { 

    private static final String SEARCH_REQUEST_URL = "http://homeseek.netau.net/searchLising.php"; 
    private Map<String, String> params; 

    public SearchListingRequest(String city, String term, String p_type, 
           int price_min, int price_max, int bedrooms, int bathrooms, Response.Listener<String> listener){ 
     super(Method.POST, SEARCH_REQUEST_URL, listener, null); 
     params = new HashMap<>(); 
     params.put("city", city); 
     params.put("term", term); 
     params.put("property_type", p_type); 
     params.put("price_min", price_min + ""); 
     params.put("price_max", price_max + ""); 
     params.put("bedrooms", bedrooms + ""); 
     params.put("bathrooms", bathrooms + ""); 
    } 

    @Override 
    public Map<String, String> getParams() { 
     return params; 
    } 

} 

,並在我的其他類ShowResults.java我撥打上面的類來創建實例,使http請求:

@Override 
    protected void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.activity_show_results); 
     //unfocus on edittexts when starting 
     this.getWindow().setSoftInputMode(WindowManager.LayoutParams.SOFT_INPUT_STATE_ALWAYS_HIDDEN); 

     //gets data from home fragment 
     Intent intent = getIntent(); 

     //initialize listview 
     data_listing = (ListView) findViewById(R.id.lv_data_listing); 

     retrieveData(showResults, intent, data_listing); 

    } 

    public void retrieveData(Activity activity,Intent intent, final ListView lv){ 
     final String inputCity = intent.getStringExtra("city"); 
     final String inputTerm = intent.getStringExtra("term"); 
     final String inputType = intent.getStringExtra("type"); 
     final int inputPMin = Integer.parseInt(intent.getStringExtra("price_min")); 
     final int inputPMax = Integer.parseInt(intent.getStringExtra("price_max")); 
     final int inputBedrooms = Integer.parseInt(intent.getStringExtra("bedrooms")); 
     final int inputBathrooms = Integer.parseInt(intent.getStringExtra("bathrooms")); 

     test = (TextView) findViewById(R.id.tv_test); 

     Response.Listener<String> responseListener = new Response.Listener<String>() { 
      @Override 
      public void onResponse(String response) { 
       try { 

        JSONObject jsonResponse = new JSONObject(response); 
        JSONArray responseArray = new JSONArray(response); 
        boolean hasData = jsonResponse.getBoolean("hasData"); 

//     check if has data 
         if(hasData){ 
          test.setText("have data"); 
        } 
        else{// no data retrieved 
         showAlertDialog(); 
          test.setText("no data"); 
        } 

       } catch (JSONException e) { 
        e.printStackTrace(); 
        Toast.makeText(getApplicationContext(), "Can't connect to server.", Toast.LENGTH_SHORT).show(); 
        test.setText("error"); 
       } 
      } 
     }; 

     SearchListingRequest searchListingRequest = 
       new SearchListingRequest(inputCity,inputTerm,inputType,inputPMin,inputPMax,inputBedrooms,inputBathrooms,responseListener); 
     RequestQueue queue = Volley.newRequestQueue(getApplicationContext()); 
     queue.add(searchListingRequest); 
    } 

當我運行該應用程序時,文本顯示「err或「這意味着它有一個錯誤。

這裏的logcat的:

Value <!DOCTYPE of type java.lang.String cannot be converted to JSONObject 

我真的不知道這意味着什麼。感謝您的幫助!

+0

你能粘貼你的回覆嗎? –

+0

你是指php文件? –

+0

使用JsonObjectRequest配對,或者根據需要擴展它。 – Memme

回答

0

這是因爲默認情況下,volley不會以JSON格式發送POST正文,我認爲服務器期待JSON中的POST正文。因此,您需要重寫getBody()方法並將應用程序/ x-www-form-urlencoded中的格式更改爲json。

請參考下面的代碼:

@Override 
    public bytes[] getBody() { 
     new JSONObject(params).toString().getBytes(); 
    } 

也可以考慮重寫getBodyContentType並將其設置爲JSON。

相關問題