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 51

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("{}");

мое решение находится вдоль линии к старый ответ.

Если значение ключа и идет какстрокаи вы хотите преобразовать его в JSONObject,

Сначала возьмите ключ.значение в строковую переменную типа

 String data = yourResponse.yourKey;

затем преобразовать в JSONArray

JSONObject myObj=new JSONObject(data);