JSON in android (Value of type java.lang.String can not be converted to JSONObject)

2
<?php

/** ESTA ES MI Database.php
 * Clase que envuelve una instancia de la clase PDO
 * para el manejo de la base de datos
 */
require_once 'mysql_login.php';
class Database
{
    /**
     * Única instancia de la clase
     */
    private static $db = null;
    /**
     * Instancia de PDO
     */
    private static $pdo;
    final private function __construct()
    {
        try {
            // Crear nueva conexión PDO
            self::getDb();
        } catch (PDOException $e) {
            // Manejo de excepciones
        }
    }
    /**
     * Retorna en la única instancia de la clase
     * @return Database|null
     */
    public static function getInstance()
    {
        if (self::$db === null) {
            self::$db = new self();
        }
        return self::$db;
    }
    /**
     * Crear una nueva conexión PDO basada
     * en los datos de conexión
     * @return PDO Objeto PDO
     */
    public function getDb()
    {
        if (self::$pdo == null) {
            self::$pdo = new PDO(
                'mysql:dbname=' . DATABASE .
                ';host=' . HOSTNAME .
                ';port:3306;', // Eliminar este elemento si se usa una instalación por defecto
                USERNAME,
                PASSWORD,
////// no se si la codificcion de aqui esta bien o como deberia ser lo e "UTF8"
                array(PDO::MYSQL_ATTR_INIT_COMMAND => "SET NAMES utf8")
            );
            // Habilitar excepciones
            self::$pdo->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
        }
        return self::$pdo;
    }
    /**
     * Evita la clonación del objeto
     */
    final protected function __clone()
    {
    }
    function _destructor()
    {
        self::$pdo = null;
    }
}
?>

<?php
/** archivo Detalle_Encuesta.php
 * Representa la estructura de los Detalles_Encuestas
 * almacenadas en la base de datos
 */
require 'Database.php';
class Encuesta
{
    function __construct()
    {
    }
    /**
     * Retorna en la fila especificada de la tabla 'Alumnos'
     *
     * @param $idEncuesta Identificador del registro
     * @return array Datos del registro
     */
    public static function getAll()
    {
        $consulta = "SELECT * FROM Detalle_Encuesta";
        try {
            // Preparar sentencia
            $comando = Database::getInstance()->getDb()->prepare($consulta);
            // Ejecutar sentencia preparada
            $comando->execute();
            return $comando->fetchAll(PDO::FETCH_ASSOC);
        } catch (PDOException $e) {
            return false;
        }
    }
?>

?php
/** ESTE ES MI ARCHIVO obtener_detalle.php de aqui es donde obtengo en JSON
 * Obtiene todos lose Detalles_Encuesta de la base de datos
 */
require 'Detalle_Encuesta.php';
if ($_SERVER['REQUEST_METHOD'] == 'GET') {
    // Manejar petición GET
    $detalle = Encuesta::getAll(); //La variable 'detalle' es independiente de la variabale 
    if ($detalle) {
       // $datos["estado"] = 1;
        $datos["Detalles"] = $detalle;
        print json_encode($datos);

    } else {
        print json_encode(array(
            "estado" => 2,
            "mensaje" => "Ha ocurrido un error"
        ));
    }
}

?>

//CODIGO EN ANDROID EDITADO DE ACUERDO A COMENTARIO
if(params[1].equals("1")){    // Consulta de todos los detalles de la encuesta
                System.out.println("entramos al primer if ");
                try {
                    url = new URL(cadena);
                    HttpURLConnection connection = (HttpURLConnection) url.openConnection(); //Abrir la conexión
                    connection.setRequestProperty("User-Agent", "Mozilla/5.0" +
                            " (Linux; Android 1.5; es-ES) Ejemplo HTTP");
                    //connection.setHeader("content-type", "application/json");

                    int respuesta = connection.getResponseCode();
                    StringBuffer buffer = new StringBuffer();

                    if (respuesta == HttpURLConnection.HTTP_OK){
                        System.out.println("1 entramos al segun if ");

                        InputStream in = new BufferedInputStream(connection.getInputStream());
                       // BufferedReader reader = new BufferedReader(new InputStreamReader(in));

                        // EDITADO PERO NI HACE ME DEJA PASARLO A ONBJETO json 
                        BufferedReader reader = new BufferedReader(new InputStreamReader(in,"UTF-8"));

                        System.out.println("2 Pasamos del Bufferader ");

                        String line;
                        while ((line = reader.readLine()) != null) {
                            buffer.append(line);
                        }
                        //Muestro lo que hay en la variable buffer y efectivamente en un objeto JSON
                        System.out.println("3 Pasamos el ciclo while y muestro lo que contiene el Json obtenido"+ buffer);

                        // Aqui trato de convertir el String a objeto JSON --Y DE AQUI NO PASA TRUENA Y LANZA LA EXCEPCION--

                        JSONObject parentObject = new JSONObject(buffer.toString()); // -- EDITADO
                        // LA LINEA DE ARRIBA LA PROBE DE ESTA FORMA  --> JSONObject parentObject = new JSONObject(buffer); Y MARCO ERROR AL COMPILAR 


                        // ---- AQUI YA NI ENTRA ---
                        System.out.println(" 5 Esto hay en la variable : " + parentObject);

                        JSONArray parentArray =parentObject.getJSONArray("Detalles");

                        System.out.println("Estoy hay en la variable paretArray: " + parentArray);

                       final StringBuffer   finalBufferedData = new StringBuffer();
                            // hay alumnos a mostrar

                            for(int i=0;i<parentArray.length();i++){

                                JSONObject finalObject = parentArray.getJSONObject(i);
                               // --- GRACIAS A QUIEN ME HIZO VER MI ERROR EN ESTAS LINEAS
                                String iddetalle = finalObject.getString("idDetalle_Encuesta");
                                String promo = finalObject.getString("Nom_Promotor"); //-- EDITADO
                                String jefe = finalObject.getString("Nom_Jefebrigada");// -- EDITADP
                                String cordi = finalObject.getString("Nom_Coordinador");
                                finalBufferedData.append(iddetalle + " " + promo + " " + jefe + cordi + "\n");

                                                       }
                                 devuelve = finalBufferedData.toString();
                              }



                } catch (MalformedURLException e) {
                    e.printStackTrace();
                    System.out.println("fallo en el primer try");
                } catch (IOException e) {
                    e.printStackTrace();
                    System.out.println("fallo en el segundo try");
                } catch (JSONException e) {
                    e.printStackTrace();
                    System.out.println("fallo en el tercer try");
                }


                return devuelve;

            }

Here I show the messages on screen where the App fails:

  

System.err: org.json.JSONException:   Value of type java.lang.String can not be converted to JSONObject   08-09 01: 33: 25.614 32730-493 / silver.serviceweb W / System.err: at   org.json.JSON.typeMismatch (JSON.java:111) 08-09 01: 33: 25.614   32730-493 / silver.serviceweb W / System.err: at   org.json.JSONObject. (JSONObject.java:160) 08-09 01: 33: 25.614   32730-493 / silver.serviceweb W / System.err: at   org.json.JSONObject. (JSONObject.java:173)

and I leave you my JSON and its structure

{
    "Detalles": [{
        "idDetalle_Encuesta": "1",
        "Nom_Promotor": "Juan",
        "Nom_Jefebrigada": "Luis",
        "Nom_Coordinador": "Maria"
    }, {
        "idDetalle_Encuesta": "13",
        "Nom_Promotor": "Silverio",
        "Nom_Jefebrigada": "Gustavo",
        "Nom_Coordinador": "Carlos"
    }, {
        "idDetalle_Encuesta": "15",
        "Nom_Promotor": "yo",
        "Nom_Jefebrigada": "yo",
        "Nom_Coordinador": "yoyo"
    }, {
        "idDetalle_Encuesta": "16",
        "Nom_Promotor": "test",
        "Nom_Jefebrigada": "test",
        "Nom_Coordinador": "tst"
    }, {
        "idDetalle_Encuesta": "1ISBUL78QB",
        "Nom_Promotor": "tregreg",
        "Nom_Jefebrigada": "rgerg",
        "Nom_Coordinador": "rgerg"
    }, {
        "idDetalle_Encuesta": "1U41OZQTA6",
        "Nom_Promotor": "Oscar",
        "Nom_Jefebrigada": "PENELOPE",
        "Nom_Coordinador": "de la rosa"
    }, {
        "idDetalle_Encuesta": "2",
        "Nom_Promotor": "Fernando",
        "Nom_Jefebrigada": "Martin",
        "Nom_Coordinador": "Luis"
    }, {
        "idDetalle_Encuesta": "3",
        "Nom_Promotor": "test",
        "Nom_Jefebrigada": "test",
        "Nom_Coordinador": "test"
    }, {
        "idDetalle_Encuesta": "4",
        "Nom_Promotor": "test",
        "Nom_Jefebrigada": "test",
        "Nom_Coordinador": "test"
    }, {
        "idDetalle_Encuesta": "5NU1EYRB5K",
        "Nom_Promotor": "GREGORIO",
        "Nom_Jefebrigada": "PENELOPE",
        "Nom_Coordinador": "PANCHA"
    }, {
        "idDetalle_Encuesta": "7NMYF3XLD7",
        "Nom_Promotor": "tes",
        "Nom_Jefebrigada": "tes",
        "Nom_Coordinador": "tes"
    }, {
        "idDetalle_Encuesta": "857MZL85O0",
        "Nom_Promotor": "Oscar",
        "Nom_Jefebrigada": "PENELOPE",
        "Nom_Coordinador": "de la rosa"
    }, {
        "idDetalle_Encuesta": "860R2JFYXV",
        "Nom_Promotor": "asa",
        "Nom_Jefebrigada": "aasa",
        "Nom_Coordinador": "asa"
    }, {
        "idDetalle_Encuesta": "9",
        "Nom_Promotor": "test",
        "Nom_Jefebrigada": "test",
        "Nom_Coordinador": "test"
    }, {
        "idDetalle_Encuesta": "96BVZ0XJL2",
        "Nom_Promotor": "Oscar",
        "Nom_Jefebrigada": "Emiliano",
        "Nom_Coordinador": "de la rosa"
    }, {
        "idDetalle_Encuesta": "BH8GU5H4N9",
        "Nom_Promotor": "tes",
        "Nom_Jefebrigada": "tes",
        "Nom_Coordinador": "tes"
    }, {
        "idDetalle_Encuesta": "CIQSBG38ZI",
        "Nom_Promotor": "Leticia Najera De La Rosa",
        "Nom_Jefebrigada": "PENELOPE",
        "Nom_Coordinador": "Lara"
    }, {
        "idDetalle_Encuesta": "D6OW6T2VDS",
        "Nom_Promotor": "pepe",
        "Nom_Jefebrigada": "sancho",
        "Nom_Coordinador": "juan"
    }, {
        "idDetalle_Encuesta": "DUM1GOWC85",
        "Nom_Promotor": "pepe",
        "Nom_Jefebrigada": "sancho",
        "Nom_Coordinador": "juan"
    }, {
        "idDetalle_Encuesta": "GQS20MPC94",
        "Nom_Promotor": "tregreg",
        "Nom_Jefebrigada": "Emiliano",
        "Nom_Coordinador": "Lara"
    }, {
        "idDetalle_Encuesta": "IZ3YT37JAT",
        "Nom_Promotor": "Oscar",
        "Nom_Jefebrigada": "Emiliano",
        "Nom_Coordinador": "Lara"
    }, {
        "idDetalle_Encuesta": "KTBOKS0QUS",
        "Nom_Promotor": "Oscar",
        "Nom_Jefebrigada": "Emiliano",
        "Nom_Coordinador": "Lara"
    }, {
        "idDetalle_Encuesta": "ONJ7QSS6WI",
        "Nom_Promotor": "Oscar",
        "Nom_Jefebrigada": "Emiliano",
        "Nom_Coordinador": "Lara"
    }, {
        "idDetalle_Encuesta": "OVOSOQHINW",
        "Nom_Promotor": "gverfve",
        "Nom_Jefebrigada": "trtrtr",
        "Nom_Coordinador": "rgerg"
    }, {
        "idDetalle_Encuesta": "PGQSY8TOKD",
        "Nom_Promotor": "pepe",
        "Nom_Jefebrigada": "sancho",
        "Nom_Coordinador": "juan"
    }, {
        "idDetalle_Encuesta": "SM5KLCA7S7",
        "Nom_Promotor": "pepe",
        "Nom_Jefebrigada": "sancho",
        "Nom_Coordinador": "juan"
    }, {
        "idDetalle_Encuesta": "W2A5S36KJ3",
        "Nom_Promotor": "asa",
        "Nom_Jefebrigada": "aasa",
        "Nom_Coordinador": "asa"
    }, {
        "idDetalle_Encuesta": "XPG6SNQQRT",
        "Nom_Promotor": "Oscar",
        "Nom_Jefebrigada": "Emiliano",
        "Nom_Coordinador": "de la rosa"
    }, {
        "idDetalle_Encuesta": "Z74YJSBTZX",
        "Nom_Promotor": "Leticia Najera De La Rosa",
        "Nom_Jefebrigada": "PENELOPE",
        "Nom_Coordinador": "Lara"
    }]
}

It is worth mentioning that I have already validated the JSON and it is fine, the detail is: why can not I pass it to a JSON object?

    
asked by carlos silverio 09.08.2017 в 08:52
source

2 answers

0

First, the error you describe in your question:

  

org.json.JSONException: Value of type java.lang.String can not be   converted to JSONObject

is caused because what you are trying to process as JSONObject is not really.

JSONObject parentObject = new JSONObject(buffer.toString());

Check carefully that it contains buffer.toString() since it is definitely not a Json object.

You also have other details, first, you can not use getString() for idDetalle_Encuesta and that it has alphanumeric values. Also the keys have incorrect names, remember that they are case-sensitive, it must be Nom_Promotor and not Nom_promotor, Nom_Jefebrigada and no Nom_jefebrigada, I add the setting:

    String iddetalle = finalObject.getString("idDetalle_Encuesta"); //NO finalObject.getInt("idDetalle_Encuesta");
    String promo = finalObject.getString("Nom_Promotor");//NO "Nom_promotor";
    String jefe = finalObject.getString("Nom_Jefebrigada");// NO "Nom_jefebrigada";
    String cordi = finalObject.getString("Nom_Coordinador");

Update:

The answer actually got a json content but it was not "valid" since at the beginning it has one or more non-printable ASCII characters, which are represented as space:

in this case one solution is to remove those ASCII characters that are not printable but prevent your response from being processed with a real json , use the method I suggest to eliminate this unnecessary information:

JSONObject parentObject = new JSONObject(buffer.toString().replaceAll("[^\x00-\x7F]", ""));
    
answered by 09.08.2017 / 20:52
source
0

Try modifying the Buffer encoding to UTF-8 thus BufferedReader reader = new BufferedReader(new InputStreamReader(in,'UTF-8')); . It is possible that when you receive the file, by the server's encoding and yours, characters that you do not see are included, but that make it a JSON invalid for the constructor.

I also recommend changing StringBuffer to StringBuilder , unless you are in a multi-threaded environment, StringBuilder will be faster.

Is the resource you are querying to receive the JSON yours? If so, do you have the code in UTF-8 ?

    
answered by 09.08.2017 в 09:27