MySQL for PHP for JSON: String cannot be converted to JSONObject

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 { /** Called when the activity is first created. */ @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(); ?> 
+4
source share
4 answers

Try changing your PHP to this:

 $output = new stdClass(); $output->regulatory = array(); while($row = mysql_fetch_assoc($sql)) { $output->regulatory[] = $row; } header('Content-type: application/json'); echo (json_encode($output)); 
+3
source

Try changing your PHP script to:

 <?php // Hide errors to prevent data corruption ini_set('display_errors', 0); // For debugging, uncomment these lines to show errors //ini_set('display_errors', 0); //error_reporting(E_ALL); //MySQL Database Connect require 'andaerologin.php'; if (!mysql_select_db("andaero")) { // Use trigger_error() so you can find out in the server logs if something // goes wrong trigger_error('Unable to select MySQL database'); header('HTTP/1.1 500 Internal Server Error'); exit; } $query = "SELECT * FROM regulatory_list"; if (!$result = mysql_query($query)) { trigger_error('MySQL error: '.mysql_error()); header('HTTP/1.1 500 Internal Server Error'); exit; } if (!mysql_num_rows($query)) { trigger_error('MySQL returned no results'); header('HTTP/1.1 500 Internal Server Error'); exit; } // Build an array of the results $output = array(); while ($row = mysql_fetch_assoc($result)) { $output[] = $row; } // Send the results back as JSON exit(json_encode($output)); // Closing the database connection happens implicitly at the end of the // script. Also, you don't need to have a closing PHP tag at the end of the // file and omitting it is a good habit to get into as it can avoid problems 
+2
source

In your PHP code, change

 json_encode($output) 

to

 json_encode($output, JSON_FORCE_OBJECT) 

JSON_FORCE_OBJECT requires PHP version> = 5.3.0

Your problem seems to be in jArray = new JSONObject(result);

I don't know what the JSONObject constructor JSONObject , but I know that you are sending it an array Json ..

+2
source

Do you really need all these fields in the table?

I once did the same, SELECT * FROM table and json_encode () all the results. JQuery seemed to have a problem reading the data, although the JSON result looks great.

So, I tried to limit the data and send only browser query fields SELECT field1, field2 FROM, and not all fields.

Then everything worked fine. I could only suspect that there is a limit on the amount of JSON data that jQuery can handle.

I know that you are not using jQuery, but I just left my experience here just in case.

+1
source

Source: https://habr.com/ru/post/1391943/


All Articles