JSONException: значение типа java.ленг.Строка не может быть преобразована в JSONObject
у меня есть JSON-файл с 2 JSON-массивами в нем: Один массив для маршрутов и один массив для достопримечательностей.
маршрут должен состоять из нескольких достопримечательностей, к которым пользователь получает навигацию. К сожалению, я получаю ошибку:
JSONException: значение типа java.ленг.Строка не может быть преобразована в JSONObject
вот мои переменные и код, который анализирует JSON-файл:
private InputStream is = null;
private String json = "";
private JSONObject jObj = null;
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();
// hier habe ich das JSON-File als String
json = sb.toString();
Log.i("JSON Parser", json);
} catch (Exception e) {
Log.e("Buffer Error", "Error converting result " + e.toString());
}
// try parse the string to a JSON object
try {
jObj = new JSONObject(json);
} catch (JSONException e) {
Log.e("JSON Parser", "Error parsing data " + e.toString());
}
// return JSON String
return jObj;
}
Log.i ("JSON Parser", json); показывает мне, что в начале из сгенерированной строки появляется странный знак:
но ошибка происходит здесь:
try {
jObj = new JSONObject(json);
} catch (JSONException e) {
Log.e("JSON Parser", "Error parsing data " + e.toString());
}
04-22 14:01:05.043: E / JSON Parser(5868): ошибка при разборе данных орг.формат JSON.JSONException: значение / / странный знак здесь / / типа Ява.ленг.Строка не может быть преобразована в JSONObject
кто-нибудь имеет представление о том, как избавиться от этих знаков, чтобы создать JSONObject?
13 ответов:
посмотреть этот http://stleary.github.io/JSON-java/org/json/JSONObject.html#JSONObject-java.lang.String-
JSONObject
public JSONObject(java.lang.String source) throws JSONException
построить JSONObject из исходной текстовой строки JSON. Это наиболее часто используемый конструктор JSONObject.
Parameters: source - `A string beginning with { (left brace) and ending with } (right brace).` Throws: JSONException - If there is a syntax error in the source string or a duplicated key.
вы пытаетесь использовать что-то типа:
new JSONObject("{your string}")
причина в том, что некоторые ненужные символы были добавлены при составлении строки. Температура раствора составляет
return new JSONObject(json.substring(json.indexOf("{"), json.lastIndexOf("}") + 1));
но попробуйте удалить скрытые символы в исходной строке.
была та же проблема в течение нескольких дней. наконец-то нашел решение. PHP сервер вернул некоторые невидимые символы, которые вы не могли видеть в журнале или в системе.из.
таким образом, решение состояло в том, что я попытался подстроить свою строку json один за другим, и когда я пришел к подстроке(3), ошибка исчезла.
кстати. я использовал кодировку UTF-8 с обеих сторон. PHP сторона:
header('Content-type=application/json; charset=utf-8');
JAVA сторона:
BufferedReader reader = new BufferedReader(new InputStreamReader(is, "utf-8"), 8);
Так что попробуйте решение по одному 1,2,3,4...! Надеюсь, это поможет вам, ребята!
try { jObj = new JSONObject(json.substring(3)); } catch (JSONException e) { Log.e("JSON Parser", "Error parsing data [" + e.getMessage()+"] "+json); }
вот версия UTF-8, с несколькими обработками исключений:
static InputStream is = null; static JSONObject jObj = null; static String json = null; static HttpResponse httpResponse = null; public JSONObject getJSONFromUrl(String url) { // Making HTTP request try { HttpParams params = new BasicHttpParams(); HttpConnectionParams.setConnectionTimeout(params, 10000); HttpConnectionParams.setSoTimeout(params, 10000); HttpProtocolParams.setVersion(params, HttpVersion.HTTP_1_1); HttpProtocolParams.setContentCharset(params, HTTP.UTF_8); HttpProtocolParams.setUseExpectContinue(params, true); // defaultHttpClient DefaultHttpClient httpClient = new DefaultHttpClient(params); HttpGet httpPost = new HttpGet( url); httpResponse = httpClient.execute( httpPost); HttpEntity httpEntity = httpResponse.getEntity(); is = httpEntity.getContent(); } catch (UnsupportedEncodingException ee) { Log.i("UnsupportedEncodingException...", is.toString()); } catch (ClientProtocolException e) { Log.i("ClientProtocolException...", is.toString()); } catch (IOException e) { Log.i("IOException...", is.toString()); } try { BufferedReader reader = new BufferedReader(new InputStreamReader( is, "utf-8"), 8); //old charset iso-8859-1 StringBuilder sb = new StringBuilder(); String line = null; while ((line = reader.readLine()) != null) { sb.append(line + "\n"); } is.close(); reader.close(); json = sb.toString(); Log.i("StringBuilder...", json); } catch (Exception e) { Log.e("Buffer Error", "Error converting result " + e.toString()); } // try parse the string to a JSON object try { jObj = new JSONObject(json); } catch (Exception e) { Log.e("JSON Parser", "Error parsing data " + e.toString()); try { jObj = new JSONObject(json.substring(json.indexOf("{"), json.lastIndexOf("}") + 1)); } catch (Exception e0) { Log.e("JSON Parser0", "Error parsing data [" + e0.getMessage()+"] "+json); Log.e("JSON Parser0", "Error parsing data " + e0.toString()); try { jObj = new JSONObject(json.substring(1)); } catch (Exception e1) { Log.e("JSON Parser1", "Error parsing data [" + e1.getMessage()+"] "+json); Log.e("JSON Parser1", "Error parsing data " + e1.toString()); try { jObj = new JSONObject(json.substring(2)); } catch (Exception e2) { Log.e("JSON Parser2", "Error parsing data [" + e2.getMessage()+"] "+json); Log.e("JSON Parser2", "Error parsing data " + e2.toString()); try { jObj = new JSONObject(json.substring(3)); } catch (Exception e3) { Log.e("JSON Parser3", "Error parsing data [" + e3.getMessage()+"] "+json); Log.e("JSON Parser3", "Error parsing data " + e3.toString()); } } } } } // return JSON String return jObj; }
Это простой способ (спасибо Gson)
JsonParser parser = new JsonParser(); String retVal = parser.parse(param).getAsString();
https://gist.github.com/MustafaFerhan/25906d2be6ca109f61ce#file-evaluatejavascript-string-problem
Я думаю, что проблема может быть в кодировке, которую вы пытаетесь использовать. Вероятно, лучше всего использовать UTF-8 вместо iso-8859-1.
также откройте любой файл, используемый для вашего InputStream и убедитесь, что никакие специальные символы не были случайно вставлены. Иногда вам нужно специально сказать своему редактору, чтобы он отображал скрытые / специальные символы.
return response;
после этого получите ответ, который нам нужно разобрать:
JSONObject myObj=new JSONObject(response);
при ответе нет необходимости в двойных кавычках.
это сработало для меня
json = json.replace("\\"","'"); JSONObject jo = new JSONObject(json.substring(1,json.length()-1));
Я сделал это изменение, и теперь он работает на меня.
//BufferedReader reader = new BufferedReader(new InputStreamReader(is, "iso-8859-1"), 8); BufferedReader reader = new BufferedReader(new InputStreamReader(is, HTTP.UTF_8), 8);
3 символа в начале строки json соответствуют маске порядка байтов (BOM), которая представляет собой последовательность байтов для идентификации файла как файла UTF8.
убедитесь, что файл, который отправляет json кодируется с utf8 (no bom) кодировка.
(У меня была та же проблема, с редактором TextWrangler. Используйте "сохранить как" - utf8 (no bom) для принудительного правильного кодирования.)
надеюсь, что это помогает.
в моем случае проблема возникла из . Это дало нежелательные символы.Вот почему
json parsing
проблема возникла.затем я вставляю мой
php code
наNotepad++
и выберитеEncode in utf-8 without BOM
отEncoding
tab и запуск этого кода -моя проблема ушла.
в моем случае мое приложение для Android использует Volley для выполнения почтового вызова с пустым телом для приложения API, размещенного в Microsoft Azure.
ошибка:
JSONException: Value <p>iisnode of type java.lang.String cannot be converted to JSONObject
это фрагмент о том, как я строил запрос Volley JSON:
final JSONObject emptyJsonObject = new JSONObject(); JsonObjectRequest request = new JsonObjectRequest(Request.Method.POST, url, emptyJsonObject, listener, errorListener);
Я решил свою проблему, создав
JSONObject
С пустым объектом JSON следующим образом:final JSONObject emptyJsonObject = new JSONObject("{}");
мое решение находится вдоль линии к старый ответ.