Welcome to OGeek Q&A Community for programmer and developer-Open, Learning and Share
Welcome To Ask or Share your Answers For Others

Categories

0 votes
1.1k views
in Technique[技术] by (71.8m points)

json - Value <br of type java.lang.String cannot be converted to JSONObject on android

This is my java code and i am getting problem in this: W/System.err(1362): org.json.JSONException: Value

public class Main extends Activity {

    // label to display gcm messages
    TextView lblMessage;
    Controller aController;


    @Override
    public void onCreate(Bundle savedInstanceState) { 
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        /******************* Intialize Database *************/
        DBAdapter.init(this);

        // Get Global Controller Class object 
        // (see application tag in AndroidManifest.xml)
        aController = (Controller) getApplicationContext();


        // Check if Internet present
        if (!aController.isConnectingToInternet()) {

            // Internet Connection is not present
            aController.showAlertDialog(Main.this,
                    "Internet Connection Error",
                    "Please connect to Internet connection", false);
            // stop executing code by return
            return;
        }

        //Check device contains self information in sqlite database or not. 
        int vDevice = DBAdapter.validateDevice();   

        if(vDevice > 0)
        {   

            // Launch Main Activity
            Intent i = new Intent(getApplicationContext(), GridViewExample.class);
            startActivity(i);
            finish();
        }
        else
        {
            String deviceIMEI = "";
            if(Config.SECOND_SIMULATOR){

                //Make it true in CONFIG if you want to open second simutor
                // for testing actually we are using IMEI number to save a unique device

                deviceIMEI = "000000000000000";
            }   
            else
            {
              // GET IMEI NUMBER      
             TelephonyManager tManager = (TelephonyManager) getBaseContext()
                .getSystemService(Context.TELEPHONY_SERVICE);
              deviceIMEI = tManager.getDeviceId(); 
            }

            /******* Validate device from server ******/
            // WebServer Request URL
            String serverURL = Config.YOUR_SERVER_URL+"validate_device.php";

            // Use AsyncTask execute Method To Prevent ANR Problem
            LongOperation serverRequest = new LongOperation(); 

            serverRequest.execute(serverURL,deviceIMEI,"","");

        }   

    }       


    // Class with extends AsyncTask class
    public class LongOperation  extends AsyncTask<String, Void, String> {

            // Required initialization

           //private final HttpClient Client = new DefaultHttpClient();
           // private Controller aController = null;
            private String Error = null;
            private ProgressDialog Dialog = new ProgressDialog(Main.this); 
            String data =""; 
            int sizeData = 0;  


            protected void onPreExecute() {
                // NOTE: You can call UI Element here.

                //Start Progress Dialog (Message)

                Dialog.setMessage("Validating Device..");
                Dialog.show();

            }

            // Call after onPreExecute method
            protected String doInBackground(String... params) {

                /************ Make Post Call To Web Server ***********/
                BufferedReader reader=null;
                String Content = "";
                     // Send data 
                    try{

                        // Defined URL  where to send data
                           URL url = new URL(params[0]);

                        // Set Request parameter
                        if(!params[1].equals(""))
                           data +="&" + URLEncoder.encode("data1", "UTF-8") + "="+params[1].toString();
                        if(!params[2].equals(""))
                               data +="&" + URLEncoder.encode("data2", "UTF-8") + "="+params[2].toString(); 
                        if(!params[3].equals(""))
                               data +="&" + URLEncoder.encode("data3", "UTF-8") + "="+params[3].toString();
                      Log.i("GCM",data);

                      // Send POST data request

                      URLConnection conn = url.openConnection(); 
                      conn.setDoOutput(true); 
                      OutputStreamWriter wr = new OutputStreamWriter(conn.getOutputStream()); 
                      wr.write( data ); 
                      wr.flush(); 

                      // Get the server response 

                      reader = new BufferedReader(new InputStreamReader(conn.getInputStream()));
                      StringBuilder sb = new StringBuilder();
                      String line = null;

                        // Read Server Response
                        while((line = reader.readLine()) != null)
                            {
                                   // Append server response in string
                                   sb.append(line + "
");
                            }

                        // Append Server Response To Content String 
                       Content = sb.toString();
                    }
                    catch(Exception ex)
                    {
                        Error = ex.getMessage();
                    }
                    finally
                    {
                        try
                        {

                            reader.close();
                        }

                        catch(Exception ex) {}
                    }

                /*****************************************************/
                return Content;
            }

            protected void onPostExecute(String Content) {
                // NOTE: You can call UI Element here.

                // Close progress dialog
                Dialog.dismiss();

                if (Error != null) {


                } else {

                    // Show Response Json On Screen (activity)

                 /****************** Start Parse Response JSON Data *************/
                    aController.clearUserData();

                    JSONObject jsonResponse;

                    try {

                         /****** Creates a new JSONObject with name/value mappings from the JSON string. ********/
                         jsonResponse = new JSONObject(Content);

                         /***** Returns the value mapped by name if it exists and is a JSONArray. ***/
                         /*******  Returns null otherwise.  *******/
                         JSONArray jsonMainNode = jsonResponse.optJSONArray("Android");

                         /*********** Process each JSON Node ************/

                         int lengthJsonArr = jsonMainNode.length();  

                         for(int i=0; i < lengthJsonArr; i++) 
                         {
                             /****** Get Object for each JSON node.***********/
                             JSONObject jsonChildNode = jsonMainNode.getJSONObject(i);

                             /******* Fetch node values **********/
                             String Status = jsonChildNode.optString("status").toString();

                             Log.i("GCM","---"+Status);

                             // IF server response status is update
                             if(Status.equals("update")){

                                String RegID      = jsonChildNode.optString("regid").toString();
                                String Name       = jsonChildNode.optString("name").toString();
                                String Email      = jsonChildNode.optString("email").toString();
                                String IMEI       = jsonChildNode.optString("imei").toString();

                               // add device self data in sqlite database
                                DBAdapter.addDeviceData(Name, Email,RegID, IMEI);

                                // Launch GridViewExample Activity
                                Intent i1 = new Intent(getApplicationContext(), GridViewExample.class);
                                startActivity(i1);
                                finish();

                                Log.i("GCM","---"+Name);
                             }
                             else if(Status.equals("install")){  

                                 // Launch RegisterActivity Activity
                                Intent i1 = new Intent(getApplicationContext(), RegisterActivity.class);
                                startActivity(i1);
                                finish();

                             }


                        }

                     /****************** End Parse Response JSON Data *************/     


                     } catch (JSONException e) {

                         e.printStackTrace();
                     }


                 }
            }

        }




    @Override
    protected void onDestroy() {

        super.onDestroy();
    }

}

PHP code:i have used a array in this.suggest me why type mismatch occuring

<?php

 require_once('loader.php');

 $imei     = $_REQUEST['data1'];
 $regID    = $_REQUEST['data2'];

//$resultUsers =  getRegIDUser($regID);
$resultUsers =  getIMEIUser($imei);

if ($resultUsers != false)
    $NumOfUsers = mysql_num_rows($resultUsers);
else
    $NumOfUsers = 0;

$jsonData      = array();

if ($NumOfUsers > 0) {

 while ($rowUsers = mysql_fetch_array($resultUsers)) {


    $jsonTempData = array(); 

    $jsonTempData['regid']        = $rowUsers["gcm_regid"];
    $jsonTempData['name']         = $rowUsers["name"];
    $jsonTempData['email']        = $rowUsers["email"];
    $jsonTempData['imei']         = $rowUsers["imei"];
    $jsonTempData['status']       = "update";

    $jsonData[] = $jsonTempData;

   }
}
else{

    $jsonTempData = array();

    $jsonTempData['regid']        = "";
    $jsonTempData['name']         = "";
    $jsonTempData['email']        = "";
    $jsonTempData['imei']         = "";
    $jsonTempData['status']       = "install";

    $jsonData[] = $jsonTempData;

}

$outputArr = array();
$outputArr['Android'] = $jsonData;    

// Encode Array To JSON Data
print_r( json_encode($outputArr));

?>

getting problems....!!

Here are the details regarding exception..

04-16 12:54:57.876: W/System.err(1603): org.json.JSONException: Value <br of type java.lang.String cannot be converted to JSONObject
04-16 12:54:57.916: W/System.err(1603):     at org.json.JSON.typeMismatch(JSON.java:111)
04-16 12:54:57.916: W/System.err(1603):     at org.json.JSONObject.<init>(JSONObject.java:158)
04-16 12:54:57.916: W/System.err(1603):     at org.json.JSONObject.<init>(JSONObject.java:171)
04-16 12:54:57.916: W/System.err(1603):     at com.androidexample.mobilegcm.Main$LongOperation.onPostExecute(Main.java:213)
04-16 12:54:57.926: W/System.err(1603):     at com.androidexample.mobilegcm.Main$LongOperation.onPostExecute(Main.java:1)
04-16 12:54:57.926: W/System.err(1603):     at android.os.AsyncTask.finish(AsyncTask.java:631)
04-16 12:54:57.946: W/System.err(1603):     at android.os.AsyncTask.access$600(AsyncTask.java:177)
04-16 12:54:57.976: W/System.err(1603):     at android.os.AsyncTask$InternalHandler.handleMessage(AsyncTask.java:644)
04-16 12:54:57.976: W/System.err(1603):     at android.os.Handler.dispatchMessage(Handler.java:99)
04-16 12:54:57.976: W/System.err(1603):     at android.os.Looper.loop(Looper.java:137)
04-16 12:54:58.007: W/System.err(1603):     at android.app.

与恶龙缠斗过久,自身亦成为恶龙;凝视深渊过久,深渊将回以凝视…
Welcome To Ask or Share your Answers For Others

1 Reply

0 votes
by (71.8m points)

About your HTML

You're trying to get rid of some HTML code that actually tells you there is an error. Here is what it looks like:

interpreted HTML response

Maybe if you solve that problem, your JSON issue will vanish on its own, because you won't have HTML stuff before your JSON.


Earlier part of the response

I guess you are getting your exception at this line (please tell me if I'm wrong):

jsonResponse = new JSONObject(Content);

If you want to know what's wrong with the parsing of Content, you might want to log that string and see how it looks.

Apparently, Content is HTML code (It contains some <br, according to the exception) instead of a proper JSON String. Take a look at where you get this string from, this is probably your problem.


UPDATE:

OK, according to what you posted, your Content string contains the JSON string (the one surrounded by braces {}) but it also contains an HTML part, which needs to be removed.

Put this code before you try to create the JSONObject:

int jsonStart = Content.indexOf("{");
int jsonEnd = Content.lastIndexOf("}");

if (jsonStart >= 0 && jsonEnd >= 0 && jsonEnd > jsonStart) {
    Content = Content.substring(jsonStart, jsonEnd + 1);
} else {
    // deal with the absence of JSON content here
}

UPDATE 2:

The previous code snippet does not seem sufficient because your HTML contains braces ({}). If the server always returns that kind of HTML, you might want to just get rid of the font tag before running the previous snippet:

Content = Content.replaceFirst("<font>.*?</font>", "");

WARNING: This is very sketchy, and answers only this very particular issue. It won't work with every possible server response.

You should have a look at other questions regarding the removal of HTML from a String in Java, for more complete answers.


与恶龙缠斗过久,自身亦成为恶龙;凝视深渊过久,深渊将回以凝视…
OGeek|极客中国-欢迎来到极客的世界,一个免费开放的程序员编程交流平台!开放,进步,分享!让技术改变生活,让极客改变未来! Welcome to OGeek Q&A Community for programmer and developer-Open, Learning and Share
Click Here to Ask a Question

...