JSONException: el valor de tipo java.lang.String no se puede convertir a JSONObject

Tengo un archivo JSON con 2 JSON-Arrays: una matriz para rutas y una matriz para vistas.

Una ruta debe consistir en varios lugares a los que se accede al usuario. Lamentablemente, recibo el error:

JSONException: el valor de tipo java.lang.String no se puede convertir a JSONObject

Aquí están mis variables y el código que analiza el archivo 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); me muestra que al comienzo de la cadena generada hay un signo extraño: enter image description here

pero el error ocurre aquí:

 try { jObj = new JSONObject(json); } catch (JSONException e) { Log.e("JSON Parser", "Error parsing data " + e.toString()); } 

04-22 14: 01: 05.043: Analizador de E / JSON (5868): Error al analizar datos org.json.JSONException: Valor // EXTRAÑO FIRMA AQUÍ // de tipo java.lang.String no se puede convertir a JSONObject

¿Alguien tiene una pista sobre cómo deshacerse de estos signos para crear JSONObject?

vea esto http://stleary.github.io/JSON-java/org/json/JSONObject.html#JSONObject-java.lang.String-

JSONObject

 public JSONObject(java.lang.String source) throws JSONException 

Construya un JSONObject a partir de una cadena de texto JSON de origen. Este es el constructor JSONObject más comúnmente utilizado.

 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. 

intenta usar algo como:

 new JSONObject("{your string}") 

La razón es que se agregaron algunos caracteres no deseados cuando compusiste la Cadena. La solución de temperatura es

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

Pero intente eliminar los caracteres ocultos en la cadena fuente.

Tuve el mismo problema por algunos días. Encontrado una solución por fin . El servidor PHP devolvió algunos caracteres invisibles que no se podían ver en el LOG o en System.out.

Entonces la solución fue que traté de subscribir mi cadena json una a una y cuando llegué a la subcadena (3) el error desapareció.

Por cierto. utilicé la encoding UTF-8 en ambos lados. Lado PHP: header('Content-type=application/json; charset=utf-8');

JAVA side: BufferedReader reader = new BufferedReader(new InputStreamReader(is, "utf-8"), 8);

¡Entonces prueba la solución uno por uno 1,2,3,4 …! Espero que les ayude chicos!

 try { jObj = new JSONObject(json.substring(3)); } catch (JSONException e) { Log.e("JSON Parser", "Error parsing data [" + e.getMessage()+"] "+json); } 

Aquí está la versión UTF-8, con varios controles de excepciones:

 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; } 

Esta es una manera simple (gracias Gson)

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

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

Creo que el problema puede estar en el juego de caracteres que estás tratando de usar. Probablemente sea mejor usar UTF-8 en lugar de iso-8859-1.

También abra cualquier archivo que esté siendo utilizado para su InputStream y asegúrese de que no se inserten accidentalmente caracteres especiales. A veces tienes que decirle específicamente a tu editor que muestre caracteres ocultos / especiales.

 return response; 

Después de eso obtenga la respuesta que necesitamos para analizar esto Por:

 JSONObject myObj=new JSONObject(response); 

En respuesta no hay necesidad de comillas dobles.

Esto funcionó para mí

 json = json.replace("\\\"","'"); JSONObject jo = new JSONObject(json.substring(1,json.length()-1)); 

Hice este cambio y ahora funciona para mí.

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

Los 3 caracteres al principio de la cadena json corresponden a la máscara de orden de bytes (BOM), que es una secuencia de bytes para identificar el archivo como archivo UTF8.

Asegúrese de que el archivo que envía el json esté codificado con encoding utf8 (no bom) .

(Tuve el mismo problema, con el editor de TextWrangler. Use guardar como – utf8 (no bom) para forzar la encoding correcta).

Espero eso ayude.

En mi caso, el problema ocurrió desde el archivo php . Le dio caracteres no deseados. Es por eso que se produjo un problema de json parsing JSON.

Luego pego mi php code en Notepad++ y selecciono Encode in utf-8 without BOM desde la pestaña Encoding y ejecuto este código-

Mi problema se fue.

En mi caso, mi aplicación de Android usa Volley para hacer una llamada POST con un cuerpo vacío a una aplicación API alojada en Microsoft Azure.

El error fue:

 JSONException: Value 

iisnode of type java.lang.String cannot be converted to JSONObject

Este es un fragmento de cómo estaba construyendo la solicitud Volley JSON:

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

JSONObject mi problema creando JSONObject con un objeto JSON vacío de la siguiente manera:

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

Mi solución está en línea con esta respuesta anterior .

si el valor de la clave viene como String y desea convertirlo a JSONObject ,

Primero tome su key.value en una variable String como

  String data = yourResponse.yourKey; 

luego conviértalo en JSONArray

 JSONObject myObj=new JSONObject(data);