错误:类型java.lang.String类型的致命错误无法转换为JSONObject

时间:2014-01-08 15:40:12

标签: java android json login

在Android中,我想实现一个登录系统,我在将String转换为JsonObject时遇到错误。这是我的活动:

public class Login extends Activity implements OnClickListener {    
    private EditText user, pass;
    private Button mSubmit;

    private ProgressDialog pDialog;
    static {
        StrictMode.ThreadPolicy policy = new StrictMode.ThreadPolicy.Builder().permitAll().build();

        StrictMode.setThreadPolicy(policy);
    }
    JSONParser jsonParser = new JSONParser();

    private static final String LOGIN_URL = "http://sorifgroupcom.ipage.com/Android/login.php";

    private static final String TAG_SUCCESS = "success";
    private static final String TAG_MESSAGE = "message";

    @Override
    protected void onCreate(Bundle savedInstanceState) {        
        super.onCreate(savedInstanceState);
        setContentView(R.layout.login);

        user = (EditText) findViewById(R.id.emailLogin);
        pass = (EditText) findViewById(R.id.MPLogin);

        mSubmit = (Button) findViewById(R.id.BtnLogin);

        mSubmit.setOnClickListener(this);        
    }

    @Override
    public void onClick(View v) {    
        switch (v.getId()) {
        case R.id.BtnLogin:
            new AttemptLogin().execute();
            break;


        default:
            break;
        }
    }

    class AttemptLogin extends AsyncTask<String, String, String> {

    @Override
    protected void onPreExecute() {
        super.onPreExecute();
        pDialog = new ProgressDialog(Login.this);
        pDialog.setMessage("Attempting login...");
        pDialog.setIndeterminate(false);
        pDialog.setCancelable(true);
        pDialog.show();
    }

    @Override
    protected String doInBackground(String... args) {
        // TODO Auto-generated method stub
        // Check for success tag
        int success;
        String username = user.getText().toString();
        String password = pass.getText().toString();
        try {
            // Building Parameters
            List<NameValuePair> params = new ArrayList<NameValuePair>();
            params.add(new BasicNameValuePair("email", username));
            params.add(new BasicNameValuePair("motdepasse", password));

            Log.d("request!", "starting");
            // getting product details by making HTTP request
            Log.i("tesssssssssssssssssssst", "test");
            JSONObject json = jsonParser.makeHttpRequest(LOGIN_URL, "POST",
                    params);

            // check your log for json response
            Log.d("Login attempt", json.toString());

            // json success tag
            success = json.getInt(TAG_SUCCESS);
            if (success == 1) {
                Log.d("Login Successful!", json.toString());
                // save user data
                SharedPreferences sp = PreferenceManager
                        .getDefaultSharedPreferences(Login.this);
                Editor edit = sp.edit();
                edit.putString("email", username);
                edit.commit();
                finish();
                return json.getString(TAG_MESSAGE);
            } else {
                Log.d("Login Failure!", json.getString(TAG_MESSAGE));
                return json.getString(TAG_MESSAGE);
            }
        } catch (JSONException e) {
            e.printStackTrace();
        }
        Log.i("tesssssssssssssssssssst", "test");
        return null;

    }

    protected void onPostExecute(String file_url) {
        pDialog.cancel();
        if (file_url != null) {
            Toast.makeText(Login.this, "", Toast.LENGTH_LONG).show();
        }

    }

}

当我将值放入TextEdit时,LogCat会输出以下错误:

E/JSON Parser(619): Error parsing data org.json.JSONException: 
    Value Fatal of type java.lang.String cannot be converted to JSONObject
E/AndroidRuntime(619): FATAL EXCEPTION: AsyncTask #1
E/AndroidRuntime(619): java.lang.RuntimeException: An error occured 
    while executing   doInBackground()

E/AndroidRuntime(619):  at android.os.AsyncTask$3.done(AsyncTask.java:299)
E/AndroidRuntime(619):  at   java.util.concurrent.FutureTask$Sync.innerSetException(FutureTask.java:273)
E/AndroidRuntime(619):  at java.util.concurrent.FutureTask.setException(FutureTask.java:124)
E/AndroidRuntime(619):  at java.util.concurrent.FutureTask$Sync.innerRun(FutureTask.java:307)
E/AndroidRuntime(619):  at java.util.concurrent.FutureTask.run(FutureTask.java:137)
E/AndroidRuntime(619):  at android.os.AsyncTask$SerialExecutor$1.run(AsyncTask.java:230)
E/AndroidRuntime(619):  at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1076)
E/AndroidRuntime(619):  at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:569)
E/AndroidRuntime(619):  at java.lang.Thread.run(Thread.java:856)
E/AndroidRuntime(619): Caused by: java.lang.NullPointerException
E/AndroidRuntime(619):  at  org.Soufiane.voyagesociale.Login$AttemptLogin.doInBackground(Login.java:110)
E/AndroidRuntime(619):  at org.Soufiane.voyagesociale.Login$AttemptLogin.doInBackground(Login.java:1)
E/AndroidRuntime(619):  at android.os.AsyncTask$2.call(AsyncTask.java:287)
E/AndroidRuntime(619):  at java.util.concurrent.FutureTask$Sync.innerRun(FutureTask.java:305)
E/AndroidRuntime(619):  ... 5 more
E/InputDispatcher(163): channel '41868f48  org.Soufiane.voyagesociale/org.Soufiane.voyagesociale.Login (server)' ~ Channel is unrecoverably broken and will be  disposed!
E/InputDispatcher(163): Received spurious receive callback for unknown input channel.    fd=193, events=0x9
E/BufferQueue(35): [] drainQueueLocked: BufferQueue has been abandoned!

这个错误是什么意思?我该如何解决这个问题?

2 个答案:

答案 0 :(得分:1)

您的错误在jsonParser.makeHttpRequest函数内。 可能是它正在从您的服务器下载一个未正确格式化的文本。

您必须检查“http://sorifgroupcom.ipage.com/Android/login.php”正在返回的内容。

我正在向该URL发出一些请求,但我没有得到任何结果(响应有空身)

可能你必须检查你的php文件才能看到它返回的内容。如果需要,可以尝试使用this online tool发送POST请求并在此处发布响应正文,或者您可以给我一个有效的用户名/密码来设置参数,看看会发生什么。

另外,如果你愿意,你可以发布php文件的内容,因为我会赌钱,错误就在那里。可能你的php文件没有打印json

答案 1 :(得分:0)

答案在你的问题中: -

java.lang.String cannot be converted to JSONObject

显然,您正在尝试将字符串转换为json,这是不可能的。 再看一下你的代码或调试它,并告诉异常即将发生的错误。 不仅是行号,也是该行的代码。

其次,您正在使用ASYNCTASK,所以不要写这些行: -

StrictMode.ThreadPolicy policy = new StrictMode.ThreadPolicy.Builder().permitAll().build();

StrictMode.setThreadPolicy(policy);

使用StrictMode

是不好的编码