Я потратил пару часов, просматривая несколько похожих ответов, прежде чем отправлять свои проблемы.
Я извлекаю данные из таблицы в моей базе данных, и я хочу закодировать ее в JSON. Однако вывод json_encode () действителен только в том случае, если таблица имеет одну строку. Если есть несколько строк, тест на http://jsonlint.com/ возвращает ошибку.
Это мой запрос:
$result = mysql_query($query); $rows = array(); //retrieve and print every record while($r = mysql_fetch_assoc($result)){ $rows['data'] = $r; //echo result as json echo json_encode($rows); }
Это дает мне следующий JSON:
{ "data": { "entry_id":"2", "entry_type":"Information Relevant to the Subject", "entry":"This is my second entry." } } { "data":{ "entry_id":"1", "entry_type":"My Opinion About What Happened", "entry":"This is my first entry." } }
Когда я запускаю тест по адресу http://jsonlint.com/ , он возвращает эту ошибку:
Parse error on line 29: ..."No comment" }}{ "data": { ---------------------^ Expecting 'EOF', '}', ',', ']'
Однако, если я использую эту первую половину JSON …
{ "data": { "entry_id":"2", "entry_type":"Information Relevant to the Subject", "entry":"This is my second entry." } }
… или если я проверю только вторую половину …
{ "data":{ "entry_id":"1", "entry_type":"My Opinion About What Happened", "entry":"This is my first entry." } }
… тот же тест вернет «Действительный JSON».
Я хочу, чтобы иметь возможность выводить в одном единственном [действительном] JSON каждой строке таблицы.
Любое предложение будет очень оценено.
Проблема в том, что вы выплевываете отдельный JSON для каждой строки, а не за все это сразу.
$result = mysql_query($query); $rows = array(); //retrieve and print every record while($r = mysql_fetch_assoc($result)){ // $rows[] = $r; has the same effect, without the superfluous data attribute $rows[] = array('data' => $r); } // now all the rows have been fetched, it can be encoded echo json_encode($rows);
Небольшое изменение, которое я сделал, заключается в том, чтобы хранить каждую строку базы данных в качестве нового значения в массиве $rows
. Это означает, что когда это будет сделано, ваш массив $rows
содержать все строки из вашего запроса, и, таким образом, вы сможете получить правильный результат после его завершения.
Проблема с вашим решением заключается в том, что вы повторяете действительный JSON для одной строки базы данных, но json_encode()
не знает обо всех других строках, поэтому вы получаете последовательность отдельных объектов JSON, в отличие от один, содержащий массив.
Вам нужно изменить свой PHP-код на что-то вроде этого:
$result = mysql_query($query); $rows = array(); //retrieve every record and put it into an array that we can later turn into JSON while($r = mysql_fetch_assoc($result)){ $rows[]['data'] = $r; } //echo result as json echo json_encode($rows);
Я думаю, вам следует
$rows = array(); while($r = mysql_fetch_assoc($result)){ $rows[]['data'] = $r; } echo json_encode($rows);
эхо должно быть помещено вне цикла.
Я пробовал то же самое в своем PHP, поэтому я пришел с этим …
$find = mysql_query("SELECT Id,nombre, appaterno, apmaterno, semestre, seccion, carrera FROM Alumno"); //check that records exist if(mysql_num_rows($find)>0) { $response= array(); $response["success"] = 1; while($line = mysql_fetch_assoc($find)){} $response[] = $line; //This worked for me } echo json_encode($response); } else { //Return error $response["success"] = 0; $response["error"] = 1; $response["error_msg"] = "Alumno could not be found"; echo json_encode($response); }
И в моем классе Android …
if (Integer.parseInt(json.getString("success")) == 1) { Iterator<String> iter = json.keys(); while (iter.hasNext()) { String key = iter.next(); try { Object value = json.get(key); if (!value.equals(1)) { JSONObject jsonArray = (JSONObject) value; int id = jsonArray.getInt("Id"); if (!db.ExisteAlumo(id)) { Log.e("DB EXISTE:","INN"); Alumno a = new Alumno(); int carrera=0; a.setId_alumno(id); a.setNombre(jsonArray.getString("nombre")); a.setAp_paterno(jsonArray.getString("appaterno")); a.setAp_materno(jsonArray.getString("apmaterno")); a.setSemestre(Integer.valueOf(jsonArray.getString("semestre"))); a.setSeccion(jsonArray.getString("seccion")); if(jsonArray.getString("carrera").equals("C")) carrera=1; if(jsonArray.getString("carrera").equals("E")) carrera=2; if(jsonArray.getString("carrera").equals("M")) carrera=3; if(jsonArray.getString("carrera").equals("S")) carrera=4; a.setCarrera(carrera); db.addAlumno(a); } } } catch (JSONException e) { // Something went wrong! } }
Я должен был потратить 15 часов на эту проблему. Были рассмотрены все варианты, рассмотренные выше. Наконец, я смог получить «стандартное решение». Проблема, как ни странно, выглядит следующим образом:
Когда интервал установлен за пределами 14 часов, json, похоже, не может его разобрать. Для JSON должен быть предел.
$sql= "SELECT cpu_name, used, timestamp FROM tbl_cpu_use WHERE timestamp>(NOW() - INTERVAL 14 HOUR) ORDER BY id"; $result=mysql_query($sql); if ($result){ $i=0; $return =[]; while($row = mysql_fetch_array($result, MYSQL_NUM)){ $rows[] = $row; } echo json_encode($rows); }else{ echo "ERROR"; }