JSONException: El valor del tipo java.lang.String no se puede convertir en JSONObject

Tengo un archivo de JSON con 2 JSON-Arrays en él: Una matriz para las rutas y una matriz para las vistas.

Una ruta debe consistir en varias vistas a las que el usuario puede navegar. Lamentablemente estoy recibiendo el error:

JSONException: El valor del tipo java.lang.String no se puede convertir en 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 principio de la cadena generada hay una señal extraña: Introduzca aquí la descripción de la imagen

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: Parser E / JSON (5868): Error al analizar datos org.json.JSONException: Valor // STRANGE SIGN HERE // del tipo java.lang.String no puede convertirse a JSONObject

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

Vea este 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 de origen JSON. Este es el constructor JSONObject más 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. 

Usted intenta utilizar algo como:

 new JSONObject("{your string}") 

La razón es que algunos caracteres no deseados se añadieron al componer la cadena. La solución temporal es

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

Pero trate de eliminar caracteres ocultos en la cadena de origen.

Tuvimos el mismo problema por unos pocos días. Encontré una solución por fin . El servidor PHP devolvió algunos caracteres que no se veían en el registro o en System.out.

Así que la solución fue que traté de substring mi json String uno por uno y cuando llegué a substring (3) el error se fue.

Por cierto Utilicé la codificación UTF-8 en ambos lados. PHP side: header('Content-type=application/json; charset=utf-8');

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

Así que pruebe 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 varias excepciones de manejo:

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

Creo que el problema puede estar en el charset que usted está intentando utilizar. Probablemente sea mejor usar UTF-8 en lugar de iso-8859-1.

También abra cualquier archivo que se esté utilizando para su InputStream y asegúrese de que no se hayan insertado accidentalmente caracteres especiales. A veces usted tiene que decir específicamente a su editor para mostrar caracteres ocultos / especiales.

 return response; 

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

 JSONObject myObj=new JSONObject(response); 

En respuesta no hay necesidad de comillas dobles.

Esto es sencillo (gracias Gson)

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

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

He hecho 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); 

Esto funcionó para mí

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

Los 3 caracteres al principio de la cadena json corresponden a Byte Order Mask (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 la codificación utf8 (no bom) .

(Tuve el mismo problema, con el editor de TextWrangler. Utilice save as – utf8 (no bom) para forzar la codificación correcta.)

Espero eso ayude.

En mi caso, el problema se produjo desde el archivo php . Se dio caracteres no deseados. Por eso se produjo un problema de json parsing .

A continuación, pego mi php code en Notepad++ y seleccione Encode in utf-8 without BOM de la ficha Encoding y ejecutar este código-

Mi problema desapareció.

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

El error fue:

 JSONException: Value <p>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); 

Solucioné mi problema creando el JSONObject con un objeto JSON vacío como sigue:

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

Mi solución está en las líneas de esta respuesta más antigua .

  • Análisis de Android JSONObject
  • cómo cambiar los datos en un idioma diferente que viene del servidor?
  • Envío y análisis de objetos JSON
  • Analizador de SAX de Android que no obtiene texto completo entre etiquetas
  • Quiero usar Xpath en Android para analizar XML
  • Cómo almacenar JSON en SQLite
  • Cargando JSON de String en JSONArray en Android
  • Analizar: enviar notificaciones push desde la aplicación
  • Parsing Gson con Json no funciona para Android
  • Envío de los datos al servidor a través del correo cuando la conexión a Internet vuelve
  • Clase de modelo para Jackson Parser para analizar propiedades en mayúsculas
  • FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.