0

I want to execute the following code but I got the error mentioned in the title, my php throws:

[{"ID":"1","UDID":null,"IDDEVICES":null,"Username":"Maiki","Password":"Bonis"}]

so I want to get in a JSONObject the response.

package com.example.mysqltest;

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.io.UnsupportedEncodingException;
import java.util.List;

import org.apache.http.HttpEntity;
import org.apache.http.HttpResponse;
import org.apache.http.NameValuePair;
import org.apache.http.client.ClientProtocolException;
import org.apache.http.client.entity.UrlEncodedFormEntity;
import org.apache.http.client.methods.HttpGet;
import org.apache.http.client.methods.HttpPost;
import org.apache.http.client.utils.URLEncodedUtils;
import org.apache.http.impl.client.DefaultHttpClient;
import org.json.JSONArray;
import org.json.JSONException;
import org.json.JSONObject;

import android.util.Log;

public class JSONParser {

    static InputStream is = null;
    static JSONObject jObj = null;
    static String json = "";

    // constructor
    public JSONParser() {

    }

    // function get json from url
    // by making HTTP POST or GET mehtod
    public JSONObject makeHttpRequest(String url, String method,
            List<NameValuePair> params) {

        // Making HTTP request
        try {

            // check for request method
            if(method == "POST"){
                // request method is POST
                // defaultHttpClient
                DefaultHttpClient httpClient = new DefaultHttpClient();
                HttpPost httpPost = new HttpPost(url);
                httpPost.setEntity(new UrlEncodedFormEntity(params));

                HttpResponse httpResponse = httpClient.execute(httpPost);
                HttpEntity httpEntity = httpResponse.getEntity();
                is = httpEntity.getContent();

            }else if(method == "GET"){
                // request method is GET
                DefaultHttpClient httpClient = new DefaultHttpClient();
                String paramString = URLEncodedUtils.format(params, "utf-8");
                url += "?" + paramString;
                HttpGet httpGet = new HttpGet(url);

                HttpResponse httpResponse = httpClient.execute(httpGet);
                HttpEntity httpEntity = httpResponse.getEntity();
                is = httpEntity.getContent();
            }           

        } catch (UnsupportedEncodingException e) {
            e.printStackTrace();
        } catch (ClientProtocolException e) {
            e.printStackTrace();
        } catch (IOException e) {
            e.printStackTrace();
        }

        try {
            BufferedReader reader = new BufferedReader(new InputStreamReader(
                    is, "iso-8859-1"), 8);
            StringBuilder sb = new StringBuilder();
            String line = null;
            while ((line = reader.readLine()) != null) {
                sb.append(line + "\n");
            }
            is.close();
            json = sb.toString();
        } catch (Exception e) {
            Log.e("Buffer Error", "Error converting result " + e.toString());
        }

        // try parse the string to a JSON object
        try {
            jObj = new JSONObject(json);
        } catch (JSONException e) {
            Log.e("JSON Parser", "Error parsing data " + e.toString());
        }


        return jObj;


    }
}

Here is the code for the login:

package com.example.mysqltest;

import java.util.ArrayList;
import java.util.List;

import org.apache.http.NameValuePair;
import org.apache.http.message.BasicNameValuePair;
import org.json.JSONException;
import org.json.JSONObject;

import android.app.Activity;
import android.app.ProgressDialog;
import android.content.Intent;
import android.os.AsyncTask;
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 Login extends Activity implements OnClickListener{

    private EditText user, pass;
    private Button mSubmit, mRegister;

     // Progress Dialog
    private ProgressDialog pDialog;

    // JSON parser class
    JSONParser jsonParser = new JSONParser();

    //php login script location:

    //localhost :  
    //testing on your device
    //put your local ip instead,  on windows, run CMD > ipconfig
    //or in mac's terminal type ifconfig and look for the ip under en0 or en1
   // private static final String LOGIN_URL = "http://xxx.xxx.x.x:1234/webservice/login.php";

    //testing on Emulator:
    //private static final String LOGIN_URL = "http://10.0.2.2:1234/webservice/login.php";

  //testing from a real server:
    private static final String LOGIN_URL = "http://bla/loginPOS2.php";

    //JSON element ids from repsonse of php script:
    private static final String TAG_SUCCESS = "success";
    private static final String TAG_MESSAGE = "message";


    @Override
    protected void onCreate(Bundle savedInstanceState) {
        // TODO Auto-generated method stub
        super.onCreate(savedInstanceState);
        setContentView(R.layout.login);

        //setup input fields
        user = (EditText)findViewById(R.id.username);
        user.setText("Maiki");
        pass = (EditText)findViewById(R.id.password);
        pass.setText("Bonis");
        //setup buttons
        mSubmit = (Button)findViewById(R.id.login);
        mRegister = (Button)findViewById(R.id.register);

        //register listeners
        mSubmit.setOnClickListener(this);
        mRegister.setOnClickListener(this);

    }

    @Override
    public void onClick(View v) {
        // TODO Auto-generated method stub
        switch (v.getId()) {
        case R.id.login:
                new AttemptLogin().execute();
            break;
        case R.id.register:
                Intent i = new Intent(this, Register.class);
                startActivity(i);
            break;

        default:
            break;
        }
    }

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

         /**
         * Before starting background thread Show Progress Dialog
         * */
        boolean failure = false;

        @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("username", username));
                params.add(new BasicNameValuePair("password", password));

                Log.d("request!", "starting");
                // getting product details by making HTTP request
                JSONObject json = jsonParser.makeHttpRequest(
                       LOGIN_URL, "GET", 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());
                    Intent i = new Intent(Login.this, ReadComments.class);
                    finish();
                    startActivity(i);
                    return json.getString(TAG_MESSAGE);
                }else{
                    Log.d("Login Failure!", json.getString(TAG_MESSAGE));
                    return json.getString(TAG_MESSAGE);

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

            return null;

        }
        /**
         * After completing background task Dismiss the progress dialog
         * **/
        protected void onPostExecute(String file_url) {
            // dismiss the dialog once product deleted
            pDialog.dismiss();
            if (file_url != null){
                Toast.makeText(Login.this, file_url, Toast.LENGTH_LONG).show();
            }

        }

    }


}

And here is the php that is executed for getting the values:

<?php
//login.php

//include ("ChromePhp.php");


$username = $_GET['username'];
$password = $_GET['password'];

include("sessvars.inc.php");

$con = mysql_connect($SESS_SERVER,$SESS_USEREXT,$SESS_PASSEXT);
    if(!$con)
    {
        $TitleMessage='Error';
        $Message='Connection Failed';
    }
    else
    {
          $db=$SESS_DATAB;

          mysql_select_db($db,$con);

$q=mysql_query(" SELECT * FROM MW_MWdevices WHERE Username='$username' and Password='$password' ");

//$q=mysql_query("SELECT * FROM MW_MWdevices");

while($e=mysql_fetch_assoc($q))

              $output[]=$e;

      print(json_encode($output));

mysql_close($link);
}


?>

So the error begins in the part:

 try {
                jObj = new JSONObject(json);
            } catch (JSONException e) {
                Log.e("JSON Parser", "Error parsing data " + e.toString());
            }

Saying that org.json.JSONObject cannot be converted to JSONArray and that stuff.

2 Answers 2

2

This:

[{"ID":"1","UDID":null,"IDDEVICES":null,"Username":"Maiki","Password":"Bonis"}]

is a JSON array with 1 object in it.

This is a JSON object

{"ID":"1","UDID":null,"IDDEVICES":null,"Username":"Maiki","Password":"Bonis"}

The error is telling you that you can't put an array in a JSON object.

I don't know PHP, but my guess you can fix it by doing:

  print(json_encode($output[0]));

This is a little off topic from the question, but is advice for future questions on Stack Overflow. Your question could have been abbreviated as simply:

This code:

jObj = new JSONObject(json);

throws the exception in the title when json is [{"ID":"1","UDID":null,"IDDEVICES":null,"Username":"Maiki","Password":"Bonis"}]

While it's good to provide details, you don't want to provide too much unnecessary detail as it often confuses the question and makes it harder to find the problem. Isolate the problem and produce it with as little code as you can and then post your question with that.

Sign up to request clarification or add additional context in comments.

1 Comment

Many thanks dud you save my day!! Now I will add an array for success and make the same code for the output
2

Follow what Pete suggested above.

In case you want to support returning multiple users, then you can create the JSONArray directly with your string.

JSONArray jArray = new JSONArray (json);

Even then, it is better to tag the array to make it easier to understand. For e.g. change your format to

{"users":[
    {"ID":"1","UDID":null,"IDDEVICES":null,"Username":"Maiki","Password":"Bonis"},
    {"ID":"2".... ,
   ]
}

In this case, you create the JSONObject first and then get the array.

1 Comment

Thanks for your suggestion !! Ill do it for sure with an array for succes for the whole thing!

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.