После нескольких часов поиска и усилий я не смог исправить это. Поэтому, наконец, ища вашу помощь.
[ { "notice_id": "2", "n_header": "Class Test", "n_subject": "Class Test from 15-jan", "n_datetime": "2014-01-05 09:00:00", "noticenum": "NISTA1", "n_body": "Dear Students Class test 1 will be held from january 15. \nDetaled Notice will be notified further with timetable", "n_removeby": "2014-01-05", "n_givenby": "7", "nconcerned_id": "1", "nconcerned_batch": "2010", "nconcerned_degree": "BTECH", "nconcerned_section": " " }, { "notice_id": "3", "n_header": "Comprehensive Viva", "n_subject": "Comprehensive viva from 20-feb", "n_datetime": "2014-02-05 10:00:00", "noticenum": "NISTB1", "n_body": "Students under me for comprehensive\n viva are hereby informed to clear their viva before 20th feb. After 20 feb no viva would be entertained under me.", "n_removeby": "2014-02-21", "n_givenby": "1", "nconcerned_id": "4", "nconcerned_batch": "2010", "nconcerned_degree": "BTECH", "nconcerned_section": "IT" } ]
Однако, когда я вижу это в своем браузере, он выглядит так:
http://img.ruphp.com/php/linkerror.jsp?lgfp=3000
Как вы видите, он распадается нежелательно. В результате, когда я parse
его в своем android app
я получаю value <br of type java.lang.String can't be converted to JSONArray
исключения value <br of type java.lang.String can't be converted to JSONArray
который, value <br of type java.lang.String can't be converted to JSONArray
мнению, из-за этой проблемы value <br of type java.lang.String can't be converted to JSONArray
.
Я пробовал много вещей, включая preg_replace
, str_replace
т. Д., Чтобы избежать \r\n or <br>
т. Д., Но не смог заставить это работать для меня. Наконец у меня есть функция, которую я использую следующим образом:
function parse($text) { $text = str_replace("\r\n", "\n", $text); $text = str_replace("\r", "\n", $text); $text = trim( preg_replace( '/\s+/', '<br/>', $text)); // JSON requires new line characters be escaped $text = str_replace("\n", "\\n", $text); return $text;
}
Я пишу запрос для извлечения данных из базы данных postgresql
Работает следующий цикл.
for ($i=0; $i<$rows; $i++) { $row = pg_fetch_array($result, $i, PGSQL_ASSOC); $json['notice_id'] = trim(strip_tags($row['notice_id'])); $json['n_header'] = trim(strip_tags($row['n_header'])); $json['n_subject'] = trim(strip_tags($row['n_subject'])); $json['n_datetime'] = trim(strip_tags($row['n_datetime'])); $json['noticenum'] = trim(strip_tags($row['noticenum'])); $json['n_body'] = trim(strip_tags($row['n_body'])); $json['n_removeby']= trim(strip_tags($row['n_removeby'])); $json['n_givenby'] = trim(strip_tags($row['n_givenby'])); $json['nconcerned_id'] = trim(strip_tags($row['nconcerned_id'])); $json['notice_id'] = trim(strip_tags($row['notice_id'])); $json['nconcerned_batch'] = trim(strip_tags($row['nconcerned_batch'])); $json['nconcerned_degree'] = trim(strip_tags($row['nconcerned_degree'])); $json['nconcerned_section'] = trim(strip_tags($row['nconcerned_section'])); parse($json['notice_id']); parse($json['n_header']); parse($json['n_subject']); parse($json['n_datetime']); parse($json['noticenum']); parse($json['n_removeby']); parse($json['n_givenby']); parse($json['nconcerned_id']); parse($json['notice_id']); parse($json['nconcerned_batch']); parse($json['nconcerned_degree']); parse($json['nconcerned_section']); $data[] = $json; } $h = json_encode($data); echo $h ; }
Как я мог избавиться от этой проблемы и получить аккуратный json
который не приведет к jsonexception
?
Я проверил много раз для разломов там. Но в моей базе данных нет строк ( \n
) и т. Д.
Отредактированный код
$data = array (); for ($i=0; $i<$rows; $i++) { $row = pg_fetch_array($result, $i, PGSQL_ASSOC); $json['notice_id'] = $row['notice_id']; $json['n_header'] = $row['n_header']; $json['n_subject'] = $row['n_subject']; $json['n_datetime'] = $row['n_datetime']; $json['noticenum'] = $row['noticenum']; $json['n_body'] = $row['n_body']; $json['n_removeby']= $row['n_removeby']; $json['n_givenby'] = $row['n_givenby']; $json['nconcerned_id'] = $row['nconcerned_id']; $json['notice_id'] = $row['notice_id']; $json['nconcerned_batch'] = $row['nconcerned_batch']; $json['nconcerned_degree'] = $row['nconcerned_degree']; $json['nconcerned_section'] = $row['nconcerned_section']; $json['notice_id']=parse($json['notice_id']); $json['n_header']=parse($json['n_header']); $json['n_subject']= parse($json['n_subject']); $json['n_datetime']=parse($json['n_datetime']); $json['noticenum']=parse($json['noticenum']); $json['n_removeby']=parse($json['n_removeby']); $json['n_givenby']=parse($json['n_givenby']); $json['nconcerned_id']=parse($json['nconcerned_id']); $json['notice_id']=parse($json['notice_id']); $json['nconcerned_batch']=parse($json['nconcerned_batch']); $json['nconcerned_degree']=parse($json['nconcerned_degree']); $json['nconcerned_section']=parse($json['nconcerned_section']); $data[] = $json; } $h = json_encode($data); echo $h ;
вывода в браузере сейчас
http://img.ruphp.com/php/linkerror.jsp?lgfp=3000
Вот еще один json, который аккуратно появляется в моем браузере.
http://img.ruphp.com/php/linkerror.jsp?lgfp=3000
Странно, почему у другого нет линии!
Странное решение
Я не уверен, что решило эту проблему. Но когда я изменил url
который использовал для выполнения моего php
файла, и это сработало для меня.
Вы неправильно интерпретируете отображение своего браузера. Помните, что JSON – это, по сути, простой текст, но ваш браузер пытается отобразить его как HTML. \n
символы не соблюдаются дисплеями в режиме HTML, и они будут обтекать текст с помощью первого соответствующего символа пробела. JSON может отлично держать \n
символы внутри своих строк без каких-либо проблем.
Скорее всего, ваша ошибка в Интернете происходит из вставки, которую вы делаете при вызове preg_replace
, потому что в исходном JSON нет тегов с preg_replace
. Другими словами, вы вызываете самую ошибку, которую пытаетесь исправить, пытаясь исправить ошибку, которая не существовала бы, если бы вы не пытались ее исправить.
OK на основе ваших входов, я сделал полный рабочий пример в зависимости от некоторого ответа здесь при переполнении стека, Parse JSON из URLhone android .
Часть PHP
у меня есть ваши данные, поэтому я сделал пример вроде этого
<?php $row = array ( "notice_id" => "2", "n_header" => "Class Test", "n_subject" => "Class Test from 15-jan", "n_datetime" => "2014-01-05 09:00:00", "noticenum" => "NISTA1", "n_body" => "Dear Students Class test 1 will be held from january 15. \nDetaled Notice will be notified further with timetable", "n_removeby" => "2014-01-05", "n_givenby" => "7", "nconcerned_id" => "1", "nconcerned_batch" => "2010", "nconcerned_degree" => "BTECH", "nconcerned_section" => " "); $row2 = array ("notice_id" => "3", "n_header" => "Comprehensive Viva", "n_subject" => "Comprehensive viva from 20-feb", "n_datetime" => "2014-02-05 10:00:00", "noticenum" => "NISTB1", "n_body" => "Students under me for comprehensive\n viva are hereby informed to clear their viva before 20th feb. After 20 feb no viva would be entertained under me.", "n_removeby" => "2014-02-21", "n_givenby" => "1", "nconcerned_id" => "4", "nconcerned_batch" => "2010", "nconcerned_degree" => "BTECH", "nconcerned_section" => "IT"); $data [] =$row; $data [] = $row2; echo json_encode ($data);
Android часть
class MyAsyncTask extends AsyncTask<String, String, Void> { private ProgressDialog progressDialog = new ProgressDialog(MainActivity.this); InputStream inputStream = null; String result = ""; protected void onPreExecute() { progressDialog.setMessage("Downloading your data..."); progressDialog.show(); progressDialog.setOnCancelListener(new OnCancelListener() { public void onCancel(DialogInterface arg0) { MyAsyncTask.this.cancel(true); } }); } @Override protected Void doInBackground(String... params) { String url_select = "http://192.168.10.206/test.php"; ArrayList<NameValuePair> param = new ArrayList<NameValuePair>(); try { // Set up HTTP post // HttpClient is more then less deprecated. Need to change to URLConnection HttpClient httpClient = new DefaultHttpClient(); HttpPost httpPost = new HttpPost(url_select); httpPost.setEntity(new UrlEncodedFormEntity(param)); HttpResponse httpResponse = httpClient.execute(httpPost); HttpEntity httpEntity = httpResponse.getEntity(); // Read content & Log inputStream = httpEntity.getContent(); } catch (UnsupportedEncodingException e1) { Log.e("UnsupportedEncodingException", e1.toString()); e1.printStackTrace(); } catch (ClientProtocolException e2) { Log.e("ClientProtocolException", e2.toString()); e2.printStackTrace(); } catch (IllegalStateException e3) { Log.e("IllegalStateException", e3.toString()); e3.printStackTrace(); } catch (IOException e4) { Log.e("IOException", e4.toString()); e4.printStackTrace(); } // Convert response to string using String Builder try { BufferedReader bReader = new BufferedReader(new InputStreamReader(inputStream, "iso-8859-1"), 8); StringBuilder sBuilder = new StringBuilder(); String line = null; while ((line = bReader.readLine()) != null) { sBuilder.append(line + "\n"); } inputStream.close(); result = sBuilder.toString(); } catch (Exception e) { Log.e("StringBuilding & BufferedReader", "Error converting result " + e.toString()); } return null; } // protected Void doInBackground(String... params) protected void onPostExecute(Void v) { //parse JSON data try { JSONArray jArray = new JSONArray(result); for(int i=0; i < jArray.length(); i++) { JSONObject jObject = jArray.getJSONObject(i); String name = jObject.getString("n_body"); String tab1_text = jObject.getString("n_removeby"); int active = jObject.getInt("notice_id"); Log.i("NAME",name); Log.i("REMOVE",tab1_text); } // End Loop this.progressDialog.dismiss(); } catch (JSONException e) { Log.e("JSONException", "Error: " + e.toString()); } // catch (JSONException e) } // protected void onPostExecute(Void v) } //class MyAsyncTask extends AsyncTask<String, String, Void>
не забудьте вызвать задачу MyAsync, где это возможно.
MyAsyncTask task = new MyAsyncTask(); task.execute();
И это работает очень хорошо, поэтому, пожалуйста, просмотрите свой код Android, где я считаю, что проблема от их, надеюсь, эта помощь вам поможет.