I have searched for solutions for a day and cannot find one that applies for my situation. I am sorry but I am new to JSON (self taught programmer) and I don't know what classes should I only post, so I will put in everything I have. I am getting the following error from LogCat:
Error parsing data org.json.JSONException: Value <?xml of type java.lang.String cannot be converted to JSONArray
Here is my class:
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;
}}
}
I found in which line I am getting the error by displaying error messages in LogCat.
Here is my PHP file that I am trying to get response from:
<?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);
}
}
?>
Here is my JSON Response:
{
"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
}
Here is my JSON Parser Class:
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;
}
}
Any help would be really helpful, possible explaining why I have this error so I don't repeat it again.
This can cause problem
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>";
your service is echoing other things. It should only be echo'ing the JSON.
header("Content-Type: application/json");
Also the header is important to have:
header("Content-Type: application/json");
Place it at the top of your script.
EDIT: I just tried your code, and I can parse the JSON without error.
Most likely your PHP server is sending XML for some reason. You need to check that script again. It could even be error reporting messing your encoded json, Log any error but only echo the JSON .
Hope this helps.
php页面正在回显其他字符串,而不是json(仅)。
I strongly recommend using Gson to parse your JSON response.
For the example above the class would look like this:
public class ItemList {
List<Item> items;
}
and Item
would be:
public class Item {
private String ID;
private String Location;
private String Description;
private String Longitude;
private String Latitude;
private String Time;
}
Then, parsing becomes absolutely trivial. Put gson-2.2.4.jar
in your libs folder, and then just do this:
Gson GSON = new Gson();
ItemList itemList = GSON.fromJson(json_string_here, ItemList.class);
That's it. You have a first class java object parsed from JSON. Easy and powerful.
The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.