2016-07-04 4 views
0

안녕하세요, 웹 서버에서 데이터를 가져 오기 위해 안드로이드 발리와 json을 사용하여 데이터를 검색하는 중 문제가 발생했습니다.java.lang.String 유형의 값을 Response.Listener에서 JSONObject로 변환 할 수 없습니다.

을 heres 내 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); 
?> 

내가 자바 클래스 이름 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 또는 "그것은 jsonexception이 있음을 의미합니다.

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

난 정말이게 무슨 뜻인지 모르겠어요 :

여기에 로그 캣입니다. 도와 줘서 고맙다!

+0

응답을 붙여 넣을 수 있습니까? –

+0

당신은 PHP 파일을 의미합니까? –

+0

JsonObjectRequest 메이트를 사용하거나 필요에 따라 잘 확장하십시오. – Memme

답변

0

기본적으로 발리는 POST 본문을 JSON 형식으로 보내지 않으므로 서버가 JSON의 POST 본문을 기다리고 있기 때문입니다. 따라서 getBody() 메소드를 대체하고 application/x-www-form-urlencoded에서 json으로 형식을 변경해야합니다.

아래의 코드를 참조하십시오 :

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

는 또한 getBodyContentType을 무시하고 JSON으로 설정하는 것이 좋습니다를.

관련 문제