I am trying to get data from mySQL database using PHP. This is my first attempt to retrieve data remotely and use JSON. The php file works correctly because it is displayed in the browser as a JSON string, and I valadated using JSONLint . So I'm not sure what is wrong with me here. Any help would be greatly appreciated.
This is what LogCat throws:
Error parsing data org.json.JSONException: Value <?xml of type java.lang.String cannot be converted to JSONObject threadid=9: thread exiting with uncaught exception (group=0x401dce20) FATAL EXCEPTION: Thread-10 java.lang.NullPointerException at com.andaero.test.JSON.JSONMain$1.run(JSONMain.java:39) at java.lang.Thread.run(Thread.java:1020)
UPDATE: I removed the echo method from the php file as Mark requested. I think this is due to "JSONArray a = json.getJSONArray (" regulatory "). I also tried using all the others without prevailing.
Here are the classes:
public class JSONfunctions { public static JSONObject getJSONfromURL(String url) { InputStream is = null; String result = "regulatory"; JSONObject jArray = null; // http post try { HttpClient httpclient = new DefaultHttpClient(); HttpPost httppost = new HttpPost(url); HttpResponse response = httpclient.execute(httppost); HttpEntity entity = response.getEntity(); is = entity.getContent(); } catch (Exception e) { Log.e("log_tag", "Error in http connection " + e.toString()); } // convert response to string 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(); result = sb.toString(); } catch (Exception e) { Log.e("log_tag", "Error converting result " + e.toString()); } try { jArray = new JSONObject(result); } catch (JSONException e) { Log.e("log_tag", "Error parsing data " + e.toString()); } return jArray; } }
List Activity:
public class JSONMain extends ListActivity { @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.listview); final ArrayList<HashMap<String, String>> mylist = new ArrayList<HashMap<String, String>>(); new Thread(new Runnable() { public void run() { JSONObject json = JSONfunctions .getJSONfromURL("http://192.168.1.34/andaero/regulatory_list_ASC.php"); try { JSONArray a = json.getJSONArray("regulatory"); for (int i = 0; i < a.length(); i++) { HashMap<String, String> map = new HashMap<String, String>(); JSONObject e = a.getJSONObject(i); map.put("id", String.valueOf(i)); map.put("label", e.getString("label")); map.put("title", e.getString("title")); map.put("caption", e.getString("description")); map.put("dummy", e.getString("gotoURL")); mylist.add(map); } } catch (JSONException e) { Log.e("log_tag", "Error parsing data " + e.toString()); } } }).start(); ListAdapter adapter = new SimpleAdapter(this, mylist, R.layout.list_item, new String[] { "label", "title", "caption", "dummy" }, new int[] { R.id.label, R.id.listTitle, R.id.caption, R.id.dummy }); setListAdapter(adapter); final ListView lv = getListView(); lv.setTextFilterEnabled(true); lv.setOnItemClickListener(new OnItemClickListener() { public void onItemClick(AdapterView<?> parent, View view, int position, long id) { @SuppressWarnings("unchecked") HashMap<String, String> o = (HashMap<String, String>) lv .getItemAtPosition(position); Toast.makeText(JSONMain.this, "ID '" + o.get("id") + "' was clicked.", Toast.LENGTH_SHORT).show(); } }); } }
PHP:
<?php //MySQL Database Connect include 'andaerologin.php'; mysql_select_db("andaero"); $sql=mysql_query("select * from regulatory_list"); $output = array(); while($row = mysql_fetch_assoc($sql)) { $output['regulatory'][] = $row; } exit (json_encode($output)); mysql_close(); ?>