简体   繁体   中英

Problems parsing JSON data

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.


Instead such information could be logged

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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM