it-swarm.com.ru

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 (5868): ошибка анализа данных org.json.JSONException: значение // STRANGE SIGN HERE // типа Java.lang.String не может быть преобразовано в JSONObject

кто-нибудь знает, как избавиться от этих признаков, чтобы создать JSONObject?

57
RCK69

увидеть это 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}")
33
Zaz Gmy

Причина в том, что при создании строки были добавлены некоторые ненужные символы. Временное решение

return new JSONObject(json.substring(json.indexOf("{"), json.lastIndexOf("}") + 1));

Но попробуйте удалить скрытые символы в исходной строке.

37
khaintt

Была такая же проблема в течение нескольких дней. наконец-то нашел решение. Сервер PHP вернул некоторые невидимые символы, которые вы не могли увидеть в журнале или в System.out.

Таким образом, решение состояло в том, что я попытался подстроковать мою строку 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);
        }
15
MTurPash

Вот версия 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;

}
7
izbrannick

Это простой способ (спасибо Gson)

JsonParser parser = new JsonParser();
String retVal = parser.parse(param).getAsString();

https://Gist.github.com/MustafaFerhan/25906d2be6ca109f61ce#file-evaluatejavascript-string-problem

5
Mustafa Ferhan

Я думаю, что проблема может быть в кодировке, которую вы пытаетесь использовать. Вероятно, лучше использовать UTF-8 вместо iso-8859-1.

Также откройте любой файл, который используется для вашего InputStream, и убедитесь, что никакие специальные символы не были случайно вставлены. Иногда вам нужно специально указать редактору отображать скрытые/специальные символы.

4
Nic Raboy

Это сработало для меня

json = json.replace("\\\"","'");
JSONObject jo = new JSONObject(json.substring(1,json.length()-1));
3
Alex Escobar
return response;

После этого получите ответ, нам нужно разобрать это:

JSONObject myObj=new JSONObject(response);

При ответе нет необходимости в двойных кавычках.

3
user4879711

Я сделал это изменение, и теперь оно работает для меня.

//BufferedReader reader = new BufferedReader(new InputStreamReader(is, "iso-8859-1"), 8);
BufferedReader reader = new BufferedReader(new InputStreamReader(is, HTTP.UTF_8), 8);
2
Jamal

В моем случае мое приложение Android использует Volley для вызова POST с пустым телом приложения API, размещенного в Microsoft Azure.

Ошибка была:

JSONException: Value <p>iisnode of type Java.lang.String cannot be converted to JSONObject

Вот фрагмент того, как я строил запрос JSON Volley:

final JSONObject emptyJsonObject = new JSONObject();
JsonObjectRequest request = new JsonObjectRequest(Request.Method.POST, url, emptyJsonObject, listener, errorListener);

Я решил свою проблему, создав JSONObject с пустым объектом JSON следующим образом:

final JSONObject emptyJsonObject = new JSONObject("{}");

Мое решение заключается в том, чтобы этот старый ответ .

1
Pablo Carbajal

3 символа в начале вашей строки json соответствуют маске порядка байтов (BOM), которая представляет собой последовательность байтов для идентификации файла как файла UTF8.

Убедитесь, что файл, отправляющий json, закодирован с помощью tf8 (no bom) encoding.

(У меня была та же проблема, с редактором TextWrangler. Используйте сохранить как - tf8 (без бомбы), чтобы принудительно выбрать правильную кодировку .)

Надеюсь, поможет.

1
stevenwood

В моем случае проблема произошла из файла php. Это дало нежелательные символы. Вот почему возникла проблема json parsing.

Затем я вставляю свой php code в Notepad++ и выбираю Encode in utf-8 without BOM на вкладке Encoding и запускаю этот код-

Моя проблема ушла.

1
Abu Mohammad Rasel

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

Сначала возьмите key.value в переменную типа String, например

 String data = yourResponse.yourKey;

затем конвертировать в JSONArray

JSONObject myObj=new JSONObject(data);
0
Thunder