Objeto JSON consigue problema

Hy!

Tengo un objeto Json:

                            HttpResponse responsePOST = client.execute(post);  
                            HttpEntity resEntity = responsePOST.getEntity();
                            final JSONObject jObject = new JSONObject(EntityUtils.toString(resEntity));
                            Log.e("test", jObject.toString());

Log:

{"responseData":null,"responseStatus":200,"responseDetails":null}

Código:

Log.e("test", String.valueOf(jObject.getInt("responseStatus")))`;

Log:

200

Obtenga Int de Json:

                                    if (jObject.getInt("responseStatus")== 200)
                                {
                                    Toast toast ;
                                    toast =     Toast.makeText(getApplicationContext(), "OK", 500);
                                toast.show();
                                    finish();
                                }
 else
                                {
                                    Log.e("else", "else");
                                    //dismissDialog(DIALOG_LOADING);
                                     if (jObject.getInt("responseStatus")== 500)
                                     {
                                         throw new Exception("Server Error");
                                     }
                                     else if (jObject.getInt("responseStatus")== 400)
                                     {
                                         throw new Exception("Wrong User/Password");
                                     }
                                     else
                                     {
                                         throw new Exception();
                                     }
                                }
                              //pd.dismiss(); 


                        } catch (Exception e) {
                            Log.e("catch", "catch");
                             Toast toast ;
                                toast =     Toast.makeText(getApplicationContext(), e.getMessage(), 500);
                            toast.show();

                        }

Log:

 catch
 Value null at responseData of type org.json.JSONObject$1 cannot be converted to JSONObject

El registro dice que el responeStatus es 200, pero el brindis y el acabado no se ejecutaron

Por favor, ayuda

código completo:

package com.android.skiptvad;

import java.security.MessageDigest;
import java.security.NoSuchAlgorithmException;
import java.util.ArrayList;
import java.util.List;

import org.apache.http.HttpEntity;
import org.apache.http.HttpResponse;
import org.apache.http.NameValuePair;
import org.apache.http.client.HttpClient;
import org.apache.http.client.entity.UrlEncodedFormEntity;
import org.apache.http.client.methods.HttpPost;
import org.apache.http.impl.client.DefaultHttpClient;
import org.apache.http.message.BasicNameValuePair;
import org.apache.http.protocol.HTTP;
import org.apache.http.util.EntityUtils;
import org.json.JSONObject;

import android.app.Activity;
import android.os.Bundle;
import android.util.Log;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Button;
import android.widget.EditText;
import android.widget.Toast;


public class Registerusr extends Activity {
    /** Called when the activity is first created. */
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.regusr);
        Button bt = (Button)findViewById(R.id.reguserreq);
        final EditText user = (EditText)findViewById(R.id.reguseruser);
        final EditText pw = (EditText)findViewById(R.id.reguserpw);
        final EditText email  = (EditText)findViewById(R.id.requseremail);
        bt.setOnClickListener(new OnClickListener() {

            @Override
            public void onClick(View v) {
                if (user.getText() != null && pw.getText()!= null && email.getText()!= null)
                {
                    download(user.getText().toString(), md5(pw.getText().toString()), email.getText().toString());
                }

            }
        });
    }
    public void download (final String usr, final String pw, final String email)
    {

            try{
                            HttpClient client = new DefaultHttpClient();  
                            String postURL = "http://surfkid.redio.de/register";
                            HttpPost post = new HttpPost(postURL); 
                                List<NameValuePair> params = new ArrayList<NameValuePair>();
                                params.add(new BasicNameValuePair("username", usr));
                                params.add(new BasicNameValuePair("password", pw));
                              params.add(new BasicNameValuePair("email", email));
                            params.add(new BasicNameValuePair("country_id", "1"));
                                UrlEncodedFormEntity ent = new UrlEncodedFormEntity(params,HTTP.UTF_8);
                                post.setEntity(ent);

                                HttpResponse responsePOST = client.execute(post);  
                                HttpEntity resEntity = responsePOST.getEntity();
                                final JSONObject jObject = new JSONObject(EntityUtils.toString(resEntity));
                                Log.e("test", jObject.toString());
                                Log.e("test", String.valueOf(jObject.getInt("responseStatus")));

                                //JSONObject menuObject = jObject.getJSONObject("responseData");

                                if (jObject.getInt("responseStatus")== 200)
                                {

                                    finish();
                                }


                                else
                                {
                                    Log.e("else", "else");
                                    //dismissDialog(DIALOG_LOADING);
                                     if (jObject.getInt("responseStatus")== 500)
                                     {
                                         throw new Exception("Server Error");
                                     }
                                     else if (jObject.getInt("responseStatus")== 400)
                                     {
                                         throw new Exception("Wrong User/Password");
                                     }
                                     else
                                     {
                                         throw new Exception();
                                     }
                                }
                              //pd.dismiss(); 


                        } catch (Exception e) {
                            Log.e("catch", "catch");
                             Toast toast ;
                                toast =     Toast.makeText(getApplicationContext(), e.getMessage(), 500);
                            toast.show();
                            Log.e("catch", e.getMessage());

                        }




    }
    private String md5(String in) {

        MessageDigest digest;

        try {

            digest = MessageDigest.getInstance("MD5");

            digest.reset();        

            digest.update(in.getBytes());

            byte[] a = digest.digest();

            int len = a.length;

            StringBuilder sb = new StringBuilder(len << 1);

            for (int i = 0; i < len; i++) {

                sb.append(Character.forDigit((a[i] & 0xf0) >> 4, 16));

                sb.append(Character.forDigit(a[i] & 0x0f, 16));

            }

            return sb.toString();

        } catch (NoSuchAlgorithmException e) { e.printStackTrace(); }

        return null;

    }
}

preguntado el 08 de enero de 11 a las 18:01

Al colocar las llamadas de red en el hilo principal de la interfaz de usuario, corre el riesgo de que la aplicación no responda (ANR) y Android elimine su aplicación. Querrá hacer todas las comunicaciones de red en un hilo, busque en AsyncTask o Handler -

4 Respuestas

En tu código habías comentado //JSONObject menuObject = jObject.getJSONObject("responseData");

después de esto, obtuvo el registro de captura que mencionó "Valor nulo en responseData de tipo org.json.JSONObject $ 1 no se puede convertir a JSONObject"

porque, hacer un getJsonObject sobre un valor nulo no es posible.

tendrías que hacerlo de esta manera.

Object menuObject = jObject.get("responseData");

if(menuObject == JSONObject.NULL)
{
 // Skip processing the response Data
}

Respondido 02 Jul 16, 18:07

¿Qué sucede si quisiera analizar el resto de los datos en lugar de omitir la parte restante, que contiene información valiosa para mí? - YuDroid

Me doy cuenta de que llego un poco tarde a la fiesta, pero Sethu tiene razón. Sabía que necesitaba realizar una prueba de nulo, pero lo siguiente no funcionaría:

if(Object.get("responseData") != null)

Pero lo siguiente funciona bien:

if(Object.get("responseData") != JSONObject.NULL)

Respondido el 18 de junio de 15 a las 22:06

Esta línea es incorrecta:

toast =     Toast.makeText(getApplicationContext(), "OK", 500);

Según el documentos esta int duration es:

duration Cuánto tiempo mostrar el mensaje. Ya sea LENGTH_SHORT or LENGTH_LONG

Intente cambiar la línea a:

toast =     Toast.makeText(getApplicationContext(), "OK", Toast.LENGTH_SHORT);

Respondido el 08 de enero de 11 a las 22:01

si elimino el brindis, el acabado tampoco se ejecutará - user547995

Si arregla la tostada (o la reemplaza con una salida de registro), ¿se ejecuta el bloque de código? El problema es que el bloque de código no se está ejecutando o que el finish() no está haciendo lo que esperabas. - dave.c

el problema es la última publicación de registro que el código accede al bloque de captura porque el error de análisis - user547995

Publique la línea de código que muestra la entrada única "200" en el registro. ¿No puede almacenar ese resultado y probarlo en lugar de llamar getInt en su if ¿declaración? - dave.c

También lo es el comportamiento de que incluso cuando el registro imprime "200", continúa en el else declaración y ejecuta ese bloque de código? ¿O es que coincide con el 200 y ejecuta el bloque con finish() pero en realidad no finaliza tu aplicación? Una descripción concisa del problema ayudaría. - dave.c

Intente eliminar el Toast y el acabado y simplemente iniciar sesión en esa declaración IF; podría ser una situación en la que Android no muestre el Toast porque ya está en el proceso de finalizar la Actividad (aunque esto parece poco probable ya que Android en otras ocasiones parece feliz de hacerlo). mostrar brindis por actividades que ya han salido del primer plano)

Respondido el 08 de enero de 11 a las 22:01

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