1

Hy!

I have a Json Object:

                            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}

Code:

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

Log:

200

Get Int from 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

The log says that the responeStatus is 200, but the toast and the finish was not executed

Please help

full code:

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;

    }
}
1
  • By putting the network calls in the main UI thread you risk getting Application Not Responding (ANR) errors and Android killing your app. You'll want to do all network communication in a thread, look into AsyncTask or Handler Commented Jan 8, 2011 at 22:55

4 Answers 4

12

In your code you had commented //JSONObject menuObject = jObject.getJSONObject("responseData");

after this did you get the catch log that you have mentioned " Value null at responseData of type org.json.JSONObject$1 cannot be converted to JSONObject "

because, doing a getJsonObject over a null value is not possible.

you would have to do it this way.

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

if(menuObject == JSONObject.NULL)
{
 // Skip processing the response Data
}
Sign up to request clarification or add additional context in comments.

1 Comment

What if I would like to parse the rest of the data instead of skipping the remaining part, which contains valuable information for me?
1

I realize I'm a little late to the party but Sethu is correct. I knew I needed to test for null, but the following wouldn't work:

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

But the following works fine:

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

Comments

0

This line is incorrect:

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

According to the docs the int duration is:

duration How long to display the message. Either LENGTH_SHORT or LENGTH_LONG

Try changing the line to:

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

7 Comments

if i delete the toast the finish also won't be executed
If you fix the toast (or replace it with a Log output) does the code block execute? The problem is either that the code block isn't getting executed, or that the finish() isn't doing as you expect.
the problem is the last log post the code access the catch block because the parsing error
Post the line of code that displays the single "200" entry in the log. Can't you store that result and test it rather than calling getInt in your if statement?
So is the behaviour that even when the log prints "200" it then continues into the else statement and executes that code block? Or is it that it matches the 200 and executes the block with finish() but doesn't actually end your app? A concise description of the problem would help.
|
-2

Try removing the Toast and the finish and just logging access into that IF statement - it might be a situation where Android doesnt display the Toast because its already in the process of finishing the Activity (although this seems unlikely since Android in other times seems happy to display Toasts for Activities that have already left the foreground)

Comments

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.