JSONException: значение типа java.lang.String не может быть преобразовано в JSONObject
У меня есть файл JSON с двумя JSON-массивами в нем:
Один массив для маршрутов и один массив для прицелов.
Маршрут должен состоять из нескольких объектов, к которым пользователь переходит.
К сожалению, я получаю сообщение об ошибке:
JSONException: значение типа java.lang.String не может быть преобразовано в 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);
показывает, что в начале сгенерированной строки появляется странный знак: ![enter image description here]()
но ошибка здесь:
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): данные анализа ошибок org.json.JSONException: значение //STRANGE ЗНАЕТ ЗДЕСЬ//типа java.lang.String не может быть преобразован в JSONObject
Кто-нибудь знает, как избавиться от этих знаков, чтобы создать JSONObject?
Ответы
Ответ 1
см. это
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}")
Ответ 2
Причина заключается в том, что некоторые непринятые символы были добавлены при компоновке строки.
Временное решение
return new JSONObject(json.substring(json.indexOf("{"), json.lastIndexOf("}") + 1));
Но попытайтесь удалить скрытые символы в исходной строке.
Ответ 3
Была та же проблема в течение нескольких дней. Нашел решение наконец. Сервер PHP вернул несколько невидимых символов, которые вы не могли видеть в LOG или System.out.
Итак, решение заключалось в том, что я попытался подстроить мою строку json по одному, и когда я пришел к подстроке (3), ошибка исчезла.
BTW. Я использовал кодировку 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);
}
Ответ 4
Вот версия 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;
}
Ответ 5
Это простой способ (спасибо Gson)
JsonParser parser = new JsonParser();
String retVal = parser.parse(param).getAsString();
https://gist.github.com/MustafaFerhan/25906d2be6ca109f61ce#file-evaluatejavascript-string-problem
Ответ 6
Я думаю, что проблема может быть в кодировке, которую вы пытаетесь использовать. Вероятно, лучше использовать UTF-8 вместо iso-8859-1.
Также откройте любой файл, который используется для вашего InputStream, и убедитесь, что никакие специальные символы не были вставлены случайно. Иногда вам нужно специально указать вашему редактору отображать скрытые/специальные символы.
Ответ 7
return response;
После этого получим ответ, нам нужно разобрать это By:
JSONObject myObj=new JSONObject(response);
При ответе нет необходимости в двойных кавычках.
Ответ 8
Это сработало для меня
json = json.replace("\\\"","'");
JSONObject jo = new JSONObject(json.substring(1,json.length()-1));
Ответ 9
Я сделал это изменение, и теперь он работает для меня.
//BufferedReader reader = new BufferedReader(new InputStreamReader(is, "iso-8859-1"), 8);
BufferedReader reader = new BufferedReader(new InputStreamReader(is, HTTP.UTF_8), 8);
Ответ 10
3 символа в начале вашей строки json соответствуют маской байтов (BOM), которая представляет собой последовательность байтов, чтобы идентифицировать файл как файл UTF8.
Убедитесь, что файл, который отправляет json, закодирован с помощью utf8 (no bom).
(У меня была такая же проблема с редактором TextWrangler. Используйте save as - utf8 (no bom), чтобы принудительно ввести правильную кодировку.)
Надеюсь, это поможет.
Ответ 11
В моем случае проблема возникла из файла php
.
Это дало нежелательные символы. Вот почему возникла проблема json parsing
.
Затем вставьте php code
в Notepad++
и выберите Encode in utf-8 without BOM
от вкладки Encoding
и запускать этот код -
Моя проблема исчезла.
Ответ 12
В моем случае приложение Android использует Volley для вызова POST с пустым телом в приложение 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("{}");
Мое решение идет по строкам в этот более старый ответ.