Я столкнулся с проблемой, действительная строка JSON не может стать объектом JSON.
Я тестировал ответ, поступающий с сервера, это действительный JSON.
Я проверил в Интернете, речь идет о проблеме UTF-8 с DOM. Но даже я изменил charset в Notepad ++ в UTF-8 без DOM, эта же ошибка все еще выходит.
Мои коды:
<?php require_once("Connection/conn.php"); //parse JSON and get input $json_string = $_POST['json']; $json_associative_array = json_decode($json_string,true); $userId = $json_associative_array["userId"]; $password = $json_associative_array["password"]; $userType = $json_associative_array["userType"]; //get the resources $json_output_array = array(); $sql = "SELECT * FROM account WHERE userId = '$userId' AND password = '$password' AND userType = '$userType'"; $result = mysql_query($sql); //access success? if (!$result) { die('Invalid query: ' . mysql_error()); $json_output_array["status"] = "query failed"; } else{ $json_output_array["status"] = "query success"; } //find the particular user? if (mysql_num_rows($result) > 0){ $json_output_array["valid"] = "yes"; } else{ $json_output_array["valid"] = "no"; } //output JSON echo json_encode($json_output_array); ?>
Android-коды:
public boolean login() { // instantiates httpclient to make request DefaultHttpClient httpClient = new DefaultHttpClient(); // url with the post data String url = SERVER_IP + "/gc/login.php"; JSONObject holder = new JSONObject(); try { holder.put("userId", "S1"); holder.put("password", "s12345"); holder.put("userType", "supervisor"); } catch (JSONException e1) { // TODO Auto-generated catch block e1.printStackTrace(); } Log.d("JSON", holder.toString()); // HttpPost HttpPost httpPost = new HttpPost(url); //FormEntity ArrayList<NameValuePair> nameValuePairs = new ArrayList<NameValuePair>(); nameValuePairs.add(new BasicNameValuePair("json", holder.toString())); try { httpPost.setEntity(new UrlEncodedFormEntity(nameValuePairs)); } catch (UnsupportedEncodingException e1) { // TODO Auto-generated catch block e1.printStackTrace(); } // execution and response boolean valid = false; try { HttpResponse response = httpClient.execute(httpPost); Log.d("post request", "finished execueted"); String responseString = getHttpResponseContent(response); Log.d("post result", responseString); //parse JSON JSONObject jsonComeBack = new JSONObject(responseString); String validString = jsonComeBack.getString("valid"); valid = (validString.equals("yes"))?true:false; } catch (ClientProtocolException e) { e.printStackTrace(); } catch (IOException e) { e.printStackTrace(); } catch (JSONException e) { // TODO Auto-generated catch block e.printStackTrace(); } return valid; } private String getHttpResponseContent(HttpResponse response) { String responseString = ""; try { BufferedReader rd = new BufferedReader(new InputStreamReader( response.getEntity().getContent())); String line = ""; while ((line = rd.readLine()) != null) { responseString += line ; } rd.close(); } catch (IOException e) { // TODO Auto-generated catch block e.printStackTrace(); } return responseString; }
JSON поступает с сервера:
{ "status": "query success", "valid": "yes" }
unformat JSON:
{"status":"query success","valid":"yes"}
Когда я копирую это в блокнот ++, он становится ?{"status":"query success","valid":"yes"}
Кажется, что есть невидимый символ.
Я исправил его с помощью решения, предоставленного MuhammedPasha, которое подстроит строку JSON для удаления невидимого персонажа . И я подстрою строку JSON от 1, чтобы исправить мою проблему.
Есть способ обнаружить эти невидимые персонажи, скопировать результат журнала в блокнот ++ (копировать! Нет ввода). Если есть какой-либо символ (знак вопроса), они указывают на наличие некоторого невидимого символа.
У меня была такая же проблема. Возможно, вам нужно сохранить без юникодной подписи (BOM).