Проблемы с анализом данных JSON

Я искал решения в течение дня и не могу найти тот, который применяется для моей ситуации. Я сожалею, но я новичок в JSON (программист, занимающийся самообучением), и я не знаю, на каких классах я должен публиковать только сообщения, поэтому я поставлю все, что у меня есть. Я получаю следующую ошибку от LogCat:

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 Parser:

 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; } } 

Любая помощь была бы действительно полезной, возможно объяснить, почему у меня есть эта ошибка, поэтому я не повторяю ее снова.

Страница php вторит другим строкам вместо json (только).

Я настоятельно рекомендую использовать 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); 

Вот и все. У вас есть Java-класс первого класса, обработанный JSON. Легкий и мощный.

Это может вызвать проблемы

 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"); 

Поместите его в начало вашего скрипта.

EDIT: Я просто попробовал свой код, и я могу разобрать JSON без ошибок.

Скорее всего, ваш PHP-сервер по какой-то причине отправляет XML. Вам нужно снова проверить этот скрипт. Это может быть даже сообщение об ошибках, передающее ваш закодированный json, записывать любую ошибку, но только эхо JSON.

Надеюсь это поможет.