0

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.

Trifecta
  • 67
  • 9
  • 2
    You seem to be received XML instead of JSON. – Sotirios Delimanolis Dec 10 '13 at 18:00
  • Also this `method == "GET"` is wrong. Use `.equals` when comparing strings. – Sotirios Delimanolis Dec 10 '13 at 18:01
  • Yes I am aware of that part. What I don't know is how to fix it? Is it a problem from my database? – Trifecta Dec 10 '13 at 18:01
  • @SotiriosDelimanolis That is a pre-made parser class... Thanks for pointing that out :) – Trifecta Dec 10 '13 at 18:03
  • Please, [don't use mysql_* functions in new code](http://stackoverflow.com/questions/12859942/why-shouldnt-i-use-mysql-functions-in-php). They are no longer maintained and are officially deprecated. Learn about [prepared statements](http://en.wikipedia.org/wiki/Prepared_statement) instead, and use [PDO](http://php.net/pdo) or [MySQLi](http://php.net/mysqli) — [this article](http://php.net/manual/en/mysqlinfo.api.choosing.php) will help you decide which. If you choose PDO, [here is a good tutorial](http://wiki.hashphp.org/PDO_Tutorial_for_MySQL_Developers). – user555 Dec 10 '13 at 18:10

3 Answers3

0

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.


Instead such information could be logged
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>");

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.

meda
  • 45,103
  • 14
  • 92
  • 122
  • I changed those lines, and my application still crashes with the same error. – Trifecta Dec 10 '13 at 18:08
  • @user2904544 I just try your code and its working perfect, you have to troubleshoot the PHP, its not echo'ing the JSON properly – meda Dec 10 '13 at 18:47
  • Could the problem be because I am returning 2 float numbers (Longitude and Latitude) from my table? – Trifecta Dec 10 '13 at 18:58
  • @user2904544 No because u have it in quotes so JSON will treat it as a string, you should really debug the PHP, try commenting everything out, you can just hardcode the JSON data and echo that , then uncomment your code little by little you know basic debugging. – meda Dec 10 '13 at 20:05
0

The php page is echoing other strings instead of json(only).

Bruno Donath
  • 103
  • 3
0

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.

David S.
  • 6,567
  • 1
  • 25
  • 45