¿La cadena no se puede convertir a JSONObject?

Soy un principiante en el desarrollo de aplicaciones de Android y es la primera vez que codificaría desde cero, por eso me resulta muy difícil. Básicamente, solo quiero deshacerme del error para poder comenzar a mostrar la tabla SQL en mi aplicación de Android. Este error me lo impide porque estaba obteniendo los datos de las tablas mySQL. Estoy recibiendo esto en LogCat:

Error parsing data org.json.JSONException: Value <!DOCTYPE of type java.lang.String cannot be converted to JSONObject
05-03 15:45:25.586: W/System.err(552): java.lang.NullPointerException
05-03 15:45:25.626: W/System.err(552):  at hs.stockapp.StocksTask.doInBackground(StocksTask.java:64)

Si entendí bien el error, algo anda mal con la línea 64 de mi archivo StocksTask.java.

Línea 64: if (json.getString(KEY_SUCCESS) != null)

Extracto del código StocksTask.java:

protected Integer doInBackground(String... params)  {

    UserFunctions userFunction = new UserFunctions();
    JSONObject json = userFunction.findStocks();
    try {
        if (json.getString(KEY_SUCCESS) != null) {
            String res = json.getString(KEY_SUCCESS);

            if(Integer.parseInt(res) == 1){         
                DatabaseHandler db = new DatabaseHandler(activity.getApplicationContext());
                JSONObject json_stocks = json.getJSONObject("stocks");
                Log.v("company_name", json_stocks.getString(STOCK_COMPANY_NAME));
                userFunction.findStocks();
                db.findStocks(json_stocks.getString(STOCK_COMPANY_NAME), json_stocks.getString(STOCK_SYMBOL), json_stocks.getString(STOCK_MCAP));                        

                responseCode = 1;
                // Close Screen
                //finish();
            }else{
                responseCode = 0;
                // Error 
            }
        }
    }
    catch (NullPointerException e) {
        e.printStackTrace();
    }
    catch (JSONException e) {
        e.printStackTrace();
    }
    return responseCode;
}

Funciones de usuario.java

 public JSONObject findStocks(){
    // Building Parameters
    List<NameValuePair> params = new ArrayList<NameValuePair>();
    params.add(new BasicNameValuePair("tag", findstocks_tag));
    JSONObject json = jsonParser.getJSONFromUrl(stocksURL, params);
    // return json
    return json;
} 

index.php

else if ($tag == 'stocks'){
    // request type is view stock list
    $stocks = $db->search_stocks();
    if ($stocks != false) {
        // stocks
        // echo json with success = 1
        $response["success"] = 1;
        $response["stocks"]["company_name"] = $stocks["name"];
        $response["stocks"]["com_sym"] = $stocks["com_sym"];
        $response["stocks"]["mkt_cap"] = $stocks["mkt_cap"];
        echo json_encode($response);
    } else {
        // no stocks found
        // echo json with error = 0
        $response["error"] = 1;
        $response["error_msg"] = "No stocks found";
        echo json_encode($response);
    }

} 

DB_funciones.php

    public function search_stocks() {
    $result = mysql_query("SELECT company_name, com_sym, mkt_cap from stock ORDER BY com_sym") or die(mysql_error());
    $no_of_rows = mysql_num_rows($result);

    if ($no_of_rows > 0) {
        while($row=mysql_fetch_assoc($result)){
            $output[] = $row;
        }               
        print(json_encode($output)); 
        return $row;            
    return true;
    } else {
        // stocks not existed
        return false;
    }
mysql_close();  

}

Resultado producido de la función search_stocks

[{"company_name":"Asian Chorva","com_sym":"ASIA","mkt_cap":"4534356"},{"company_name":"Banko de Oro","com_sym":"BDO","mkt_cap":"54434"},{"company_name":"Bank of the Phil Island","com_sym":"BPI","mkt_cap":"5464554"},{"company_name":"College Hive In Boon","com_sym":"CHIB","mkt_cap":"5434654"},{"company_name":"Critical Heart Throb Racing","com_sym":"CHTR","mkt_cap":"53544564654"}]

¿Qué debo hacer con la Línea 64? MUCHAS GRACIAS :) Cualquier ayuda será muy apreciada. Información adicional al respecto será muy útil.

preguntado el 03 de mayo de 12 a las 12:05

Su servidor no parece responder con JSON, en realidad responde con xml. -

Intente enviar el encabezado ('Tipo de contenido: json/aplicación') antes de imprimir json_encode ($ salida) -

@VladimirIvanov ¡Gracias! Creo que ya me he dado cuenta de lo que significa el error. Ahora encontrar formas de cómo resolverlo. -

@ChadHedgcock Gracias, pero eso no resolvió el problema :/ -

2 Respuestas

El mensaje de error dice:

Valor

Si es <!DOCTYPE entonces no lo es [{"company_name":….

Debe averiguar exactamente qué solicitud se está realizando y por qué el servidor devuelve un documento HTML.

Verifique los registros de su servidor. Puede ser un documento de error.

contestado el 03 de mayo de 12 a las 12:05

Tal vez esté codificando la cadena JSON pero no impidiendo que el servidor produzca HTML estándar con encabezados y todo eso... - Helios

@helios Ah! ¿Alguna sugerencia de qué hacer entonces? Lo siento, estoy realmente despistado. ¡Gracias por la rápida respuesta! - Masoquista

@Masochist: seguir las instrucciones que di en mi respuesta original le dirá si la especulación de helios es correcta o no. - Quentin

@Quentin Lo tengo ahora. Por otra parte, es el error que produce el proxy cuando intento acceder a la base de datos. :/ Trataré de averiguar cómo puedo pasar a través de él y verificar si mi problema está resuelto. ¡¡Gracias!! Ustedes son de gran ayuda. - Masoquista

verifique su URL correctamente en la que se va a mostrar como "http://10.0.2.2/api/" en UserFunctions.java donde la carpeta api está almacenada en la carpeta www o htdocs

Respondido 16 Feb 13, 15:02

No es la respuesta que estás buscando? Examinar otras preguntas etiquetadas or haz tu propia pregunta.