Проблема получения объекта JSON

1

Hy!

У меня есть объект 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}

Код:

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

Log:

200

Получить Int от 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

В журнале указано, что responeStatus - 200, но тост и финиш не выполнялись

Пожалуйста, помогите

полный код:

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;

    }
}
  • 0
    Размещая сетевые вызовы в главном потоке пользовательского интерфейса, вы рискуете получить ошибки «Приложение не отвечает» (ANR) и Android убивает ваше приложение. Вы хотите, чтобы все сетевые коммуникации в потоке, посмотрите AsyncTask или Handler
Теги:

4 ответа

12
Лучший ответ

В вашем коде вы прокомментировали //JSONObject menuObject = jObject.getJSONObject("responseData");

после этого вы получили журнал catch, о котором вы упоминали "Значение null в responseData типа org.json.JSONObject $1 не может быть преобразовано в JSONObject"

потому что выполнение getJsonObject над нулевым значением невозможно.

вам придется делать это таким образом.

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

if(menuObject == JSONObject.NULL)
{
 // Skip processing the response Data
}
  • 0
    Что если я хотел бы проанализировать остальные данные вместо того, чтобы пропустить оставшуюся часть, которая содержит ценную информацию для меня?
  • 0
    Спасибо, мой друг.
1

Я понимаю, что немного опаздываю на вечеринку, но Сету прав. Я знал, что мне нужно проверить значение null, но следующее не будет работать:

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

Но следующее прекрасно работает:

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

Эта строка неверна:

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

В соответствии с docs int duration:

duration Как долго показывать сообщение. Либо LENGTH_SHORT, либо LENGTH_LONG

Попробуйте изменить строку на:

toast =     Toast.makeText(getApplicationContext(), "OK", Toast.LENGTH_SHORT);
  • 0
    если я удалю тост, финиш также не будет выполнен
  • 0
    Если вы исправите тост (или замените его выводом журнала), выполняется ли блок кода? Проблема либо в том, что блок кода не выполняется, либо в том, что finish() работает не так, как вы ожидаете.
Показать ещё 6 комментариев
-3

Попробуйте удалить Toast и закончить и просто зарегистрировать доступ к этому оператору IF - это может быть ситуация, когда Android не отображает Toast, потому что он уже находится в процессе завершения Activity (хотя это кажется маловероятным с тех пор, как Android в другие времена кажется счастливым отображать Toasts for Activities, которые уже покинули передний план)

  • 0
    проблема не в тосте ..... (обновленный код)

Ещё вопросы

Сообщество Overcoder
Наверх
Меню