2013-12-10 56 views
0

我已經搜索了一天的解決方案,但無法找到適用於我的情況的解決方案。我很抱歉,但我是JSON(自學程序員)的新手,我不知道應該只發布什麼類,所以我會放入我擁有的所有東西。我從logcat中收到以下錯誤:分析JSON數據的問題

Error parsing data org.json.JSONException: Value <?xml of type java.lang.String cannot be converted to JSONArray 

這裏是我的類:

package com.example.mytravelbuddy; 

import android.os.AsyncTask; 
import android.os.Bundle; 
import android.app.Activity; 
import android.app.ProgressDialog; 
import android.util.Log; 
import android.view.Menu; 
import android.widget.ImageView; 
import android.widget.ListAdapter; 
import android.widget.ListView; 
import android.widget.SimpleAdapter; 
import android.widget.Toast; 

import java.util.ArrayList; 
import java.util.HashMap; 
import java.util.List; 

import org.apache.http.NameValuePair; 
import org.json.JSONArray; 
import org.json.JSONException; 
import org.json.JSONObject; 

public class Itinerary extends Activity { 

    // Progress Dialog 
    private ProgressDialog pDialog; 

    //JSON Parser 
    JSONParser jParser = new JSONParser(); 

    //URL To Get Products 
    public static String url = "URL REMOVED"; //Removed my url since i was hosting online 

    //JSON Node names 
    private static final String TAG_SUCCESS = "success"; 
    private static final String TAG_ITEMS = "items"; 
    private static final String TAG_ID = "ID"; 
    private static final String TAG_LOCATION = "Location"; 
    private static final String TAG_DESCRIPTION = "Description"; 
    private static final String TAG_LATITUDE = "Latitude"; 
    private static final String TAG_LONGITUDE = "Longitude"; 
    private static final String TAG_TIME = "Time"; 

    //Array list 
    ArrayList<HashMap<String, String>> itemList; 

    //Items JSONArray 
    JSONArray items = null; 


    @Override 
    protected void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.activity_starting_point); 

     itemList = new ArrayList<HashMap<String, String>>(); 

     new LoadAllItems().execute(); 
    } 

    @Override 
    public boolean onCreateOptionsMenu(Menu menu) { 
     // Inflate the menu; this adds items to the action bar if it is present. 
     getMenuInflater().inflate(R.menu.starting_point, menu); 
     return true; 
    } 

    class LoadAllItems extends AsyncTask<String, String, String>{ 

     @Override 
     protected void onPreExecute() { 
      super.onPreExecute(); 
      pDialog = new ProgressDialog(Itinerary.this); 
      pDialog.setMessage("Loading items. Please wait..."); 
      pDialog.setIndeterminate(false); 
      pDialog.setCancelable(false); 
      pDialog.show(); 
     } 


     @Override 
     protected String doInBackground(String... arg0) { 

      //Building Params 
      List<NameValuePair> params = new ArrayList<NameValuePair>();   

      //Getting JSON String 
      JSONObject json = jParser.makeHttpRequest(url, "GET", params); 

      try{ 
       //Getting array of items 
       Log.i("Error","ERROR 1"); //This error message is displayed 
       items = json.getJSONArray(TAG_ITEMS); //This is the line that is giving me a problem 
       Log.i("Error","ERROR 2"); //This error message is not displayed 

       //Looping through 
       for(int i = 0; i < items.length();i++){ 

        JSONObject c = items.getJSONObject(i); 

        //Storing JSON item in variable 
        String location = c.getString(TAG_LOCATION); 
        String description = c.getString(TAG_DESCRIPTION); 
        String longitude = c.getString(TAG_LONGITUDE); 
        String latitude = c.getString(TAG_LATITUDE); 
        String time = c.getString(TAG_TIME); 


        //Creating HashMap 
        HashMap<String, String> map = new HashMap<String, String>(); 

        //Put value in hashmap map 
        map.put(TAG_LOCATION, location); 
        map.put(TAG_DESCRIPTION, description); 
        map.put(TAG_LONGITUDE, longitude); 
        map.put(TAG_LATITUDE, latitude); 
        map.put(TAG_TIME, time); 

        itemList.add(map); 
       } 
      }catch(JSONException e){ 
       e.printStackTrace(); 
      } 

      return null; 
     }} 
} 

我發現其中線我在logcat中顯示錯誤消息得到錯誤。

這裏是我試圖讓響應從我的PHP文件:

<?php 

$user = "root"; 
$pass = ""; 
$database = "travel_buddy"; 
$server = "127.0.0.1"; 

mysql_connect($server, $user, $pass); 
    $db_found = mysql_select_db($database); 
    if($db_found){ 
     echo"DB Found<br>"; 
    }else{ 
     echo"DB NOT Found<br>"; 
    } 
echo"Connection Established<br>"; 
get_details(); 


function get_details(){ 
$response = array(); 
$result = mysql_query("SELECT *FROM adventure"); 

if(mysql_num_rows($result)>0){ 
    $response["items"] = array(); 

    while($row = mysql_fetch_array($result)){ 
     $info = array(); 
     $product["ID"] = $row["ID"]; 
     $product["Location"] = $row["Location"]; 
     $product["Description"] = $row["Description"]; 
     $product["Latitude"] = $row["Latitude"]; 
     $product["Longitude"] = $row["Longitude"]; 
     $product["Time"] = $row["Time"]; 

     array_push($response["items"], $product); 
    } 
     $response["success"] = 1; 

     echo json_encode($response); 
} else { 
    $response["success"] = 0; 
    $response["message"] = "No Information Found"; 

    echo json_encode($response); 
} 

} 

?> 

這裏是我的JSON響應:

{ 
    "items": [ 
     { 
      "ID": "1", 
      "Location": "TEST", 
      "Description": "TEST DESC", 
      "Latitude": "1", 
      "Longitude": "2", 
      "Time": "3:00" 
     }, 
     { 
      "ID": "2", 
      "Location": "TEST2", 
      "Description": "TEST2 DESC", 
      "Latitude": "1", 
      "Longitude": "1", 
      "Time": "7:00" 
     }, 
     { 
      "ID": "3", 
      "Location": "TEST3", 
      "Description": "TEST3 DESC", 
      "Latitude": "3", 
      "Longitude": "4", 
      "Time": "12:00" 
     } 
    ], 
    "success": 1 
} 

這裏是我的JSON解析器類:

package com.example.mytravelbuddy; 

import java.io.BufferedReader; 
import java.io.IOException; 
import java.io.InputStream; 
import java.io.InputStreamReader; 
import java.io.UnsupportedEncodingException; 
import java.util.List; 

import org.apache.http.HttpEntity; 
import org.apache.http.HttpResponse; 
import org.apache.http.NameValuePair; 
import org.apache.http.client.ClientProtocolException; 
import org.apache.http.client.entity.UrlEncodedFormEntity; 
import org.apache.http.client.methods.HttpGet; 
import org.apache.http.client.methods.HttpPost; 
import org.apache.http.client.utils.URLEncodedUtils; 
import org.apache.http.impl.client.DefaultHttpClient; 
import org.json.JSONException; 
import org.json.JSONObject; 

import android.util.Log; 

public class JSONParser { 

    static InputStream is = null; 
    static JSONObject jObj = null; 
    static String json = ""; 

    // constructor 
    public JSONParser() { 

    } 

    // function get json from url 
    // by making HTTP POST or GET mehtod 
    public JSONObject makeHttpRequest(String url, String method, 
      List<NameValuePair> params) { 

     // Making HTTP request 
     try { 

      // check for request method 
      if(method == "POST"){ 
       // request method is POST 
       // defaultHttpClient 
       DefaultHttpClient httpClient = new DefaultHttpClient(); 
       HttpPost httpPost = new HttpPost(url); 
       httpPost.setEntity(new UrlEncodedFormEntity(params)); 

       HttpResponse httpResponse = httpClient.execute(httpPost); 
       HttpEntity httpEntity = httpResponse.getEntity(); 
       is = httpEntity.getContent(); 

      }else if(method == "GET"){ 
       // request method is GET 
       DefaultHttpClient httpClient = new DefaultHttpClient(); 
       String paramString = URLEncodedUtils.format(params, "utf-8"); 
       url += "?" + paramString; 
       HttpGet httpGet = new HttpGet(url); 

       HttpResponse httpResponse = httpClient.execute(httpGet); 
       HttpEntity httpEntity = httpResponse.getEntity(); 
       is = httpEntity.getContent(); 
      }   

     } catch (UnsupportedEncodingException e) { 
      e.printStackTrace(); 
     } catch (ClientProtocolException e) { 
      e.printStackTrace(); 
     } catch (IOException e) { 
      e.printStackTrace(); 
     } 

     try { 
      BufferedReader reader = new BufferedReader(new InputStreamReader(
        is, "iso-8859-1"), 8); 
      StringBuilder sb = new StringBuilder(); 
      String line = null; 
      while ((line = reader.readLine()) != null) { 
       sb.append(line + "\n"); 
      } 
      is.close(); 
      json = sb.toString(); 
     } catch (Exception e) { 
      Log.e("Buffer Error", "Error converting result " + e.toString()); 
     } 

     // try parse the string to a JSON object 
     try { 
      jObj = new JSONObject(json); 
     } catch (JSONException e) { 
      Log.e("JSON Parser", "Error parsing data " + e.toString()); 
     } 

     // return JSON String 
     return jObj; 

    } 
} 

任何幫助都會非常有幫助,可能的解釋爲什麼我有這個錯誤,所以我不再重複一遍。

+2

您似乎收到XML而不是JSON。 –

+0

也是這個'method =='GET「'是錯誤的。比較字符串時使用'.equals'。 –

+0

是的,我知道這一部分。我不知道的是如何解決它?這是我的數據庫中的問題嗎? – Trifecta

回答

0

這可能會導致問題

mysql_connect($server, $user, $pass); 
    $db_found = mysql_select_db($database); 
    if($db_found){ 
     echo"DB Found<br>"; 
    }else{ 
     echo"DB NOT Found<br>"; 
    } 
echo"Connection Established<br>"; 

您的服務呼應其他事情。 它只能回顯JSON。


代替這樣的信息可以登錄

mysql_connect($server, $user, $pass); 
    $db_found = mysql_select_db($database); 
    if($db_found){ 
     error_log("DB Found<br>"); 
    }else{ 
     error_log("DB NOT Found<br>)"; 
    } 
error_log("Connection Established<br>"); 

而且頭是有很重要的:

header("Content-Type: application/json"); 

將其放置在你的腳本的頂部。

編輯: 我只是試過你的代碼,我可以解析JSON沒有錯誤。

很可能您的PHP服務器因某種原因正在發送XML。您需要再次檢查該腳本。 它甚至可能是錯誤報告混亂你編碼的JSON,記錄任何錯誤,但只回應JSON。

希望這會有所幫助。

+0

我改變了這些行,並且我的應用程序仍然崩潰,出現相同的錯誤。 – Trifecta

+0

沒有標題的東西,仍然無法正常工作。 – Trifecta

+0

@ user2904544我只是嘗試你的代碼和它的工作完美,你必須排除PHP的故障,它不正確迴應JSON – meda

0

該PHP頁面回顯其他字符串,而不是json(僅)。

+0

我刪除了回波線。仍然不起作用。 – Trifecta

+0

在解析之前打印json字符串。 –

0

我強烈建議使用Gson來解析您的JSON響應。

對於類上面的例子是這樣的:

public class ItemList { 
    List<Item> items; 
} 

Item是:

public class Item { 
    private String ID; 
    private String Location; 
    private String Description; 
    private String Longitude; 
    private String Latitude; 
    private String Time; 
} 

然後,解析變得絕對微不足道。把gson-2.2.4.jar放在你的libs文件夾中,然後就這樣做:

Gson GSON = new Gson(); 
ItemList itemList = GSON.fromJson(json_string_here, ItemList.class); 

就是這樣。你有一個從JSON解析出來的第一類Java對象。簡單而強大。

+0

如果我使用Gson,我不需要我的解析器類? – Trifecta

+0

你仍然需要從任何服務器上下載JSON,但不需要使用'jObj = new JSONObject(json);'' –