时间:2014-04-16 13:58:43

标签: android json

这是我的java代码,我遇到了这样的问题: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 + "\n");
                            }

                        // 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代码:我在this.suggest中使用了一个数组,为什么键入不匹配

<?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));

?>

遇到问题.... !!

以下是有关例外情况的详细信息。

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.ActivityThread.main(ActivityThread.java:5041)
04-16 12:54:58.007: W/System.err(1603):     at java.lang.reflect.Method.invokeNative(Native Method)
04-16 12:54:58.016: W/System.err(1603):     at java.lang.reflect.Method.invoke(Method.java:511)
04-16 12:54:58.026: W/System.err(1603):     at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:793)
04-16 12:54:58.036: W/System.err(1603):     at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:560)
04-16 12:54:58.036: W/System.err(1603):     at dalvik.system.NativeStart.main(Native Method)

这是所有内容在日志中返回......

04-16 15:50:10.575: I/returning(1579): <br />
04-16 15:50:10.575: I/returning(1579): <font size='1'><table class='xdebug-error xe-notice' dir='ltr' border='1' cellspacing='0' cellpadding='1'>
04-16 15:50:10.575: I/returning(1579): <tr><th align='left' bgcolor='#f57900' colspan="5"><span style='background-color: #cc0000; color: #fce94f; font-size: x-large;'>( ! )</span> Notice: Undefined index: data2 in C:\wamp\www\gcm_server_files\validate_device.php on line <i>6</i></th></tr>
04-16 15:50:10.575: I/returning(1579): <tr><th align='left' bgcolor='#e9b96e' colspan='5'>Call Stack</th></tr>
04-16 15:50:10.575: I/returning(1579): <tr><th align='center' bgcolor='#eeeeec'>#</th><th align='left' bgcolor='#eeeeec'>Time</th><th align='left' bgcolor='#eeeeec'>Memory</th><th align='left' bgcolor='#eeeeec'>Function</th><th align='left' bgcolor='#eeeeec'>Location</th></tr>
04-16 15:50:10.575: I/returning(1579): <tr><td bgcolor='#eeeeec' align='center'>1</td><td bgcolor='#eeeeec' align='center'>0.0193</td><td bgcolor='#eeeeec' align='right'>145240</td><td bgcolor='#eeeeec'>{main}(  )</td><td title='C:\wamp\www\gcm_server_files\validate_device.php' bgcolor='#eeeeec'>..\validate_device.php<b>:</b>0</td></tr>
04-16 15:50:10.575: I/returning(1579): </table></font>
04-16 15:50:10.575: I/returning(1579): {"Android":[{"regid":"","name":"","email":"","imei":"","status":"install"}]}

仍然返回html代码的这么多部分..我只需要来自{&#34; Android&#34;}以后的代码部分...即最后一行......

04-16 16:17:49.925: W/System.err(4958): org.json.JSONException: Expected ':' after main at character 6 of {main}(  )</td><td title='C:\wamp\www\gcm_server_files\validate_device.php' bgcolor='#eeeeec'>..\validate_device.php<b>:</b>0</td></tr>
04-16 16:17:49.925: W/System.err(4958): </table></font>
04-16 16:17:49.925: W/System.err(4958): {"Android":[{"regid":"","name":"","email":"","imei":"","status":"install"}]}

2 个答案:

答案 0 :(得分:5)

关于您的HTML

您正试图摆脱一些实际上告诉您存在错误的HTML代码。这是它的样子:

interpreted HTML response

也许如果你解决了这个问题,你的JSON问题就会自行消失,因为你在JSON之前就没有HTML内容了。


响应的早期部分

我猜你在这一行得到了例外(请告诉我,如果我错了):

jsonResponse = new JSONObject(Content);

如果您想知道解析Content有什么问题,您可能需要记录该字符串并查看其外观。

显然,Content是HTML代码(根据例外它包含一些<br而不是正确的JSON字符串。看看你从哪里得到这个字符串,这可能是你的问题。


<强>更新

好的,根据您发布的内容,您的Content字符串包含JSON字符串(由大括号{}包围的字符串)但它还包含一个HTML部分,需要将其删除。

在尝试创建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
}

更新2:

之前的代码段似乎不够,因为您的HTML包含大括号({})。如果服务器总是返回那种HTML,您可能希望在运行上一个代码段之前删除font标记

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

警告:这非常粗略,只能回答这个非常特殊的问题。它不会对每个可能的服务器响应起作用。

您应该查看有关从Java中的字符串中删除HTML的其他问题,以获得更完整的答案。

答案 1 :(得分:1)

您必须编辑php配置文件。

找到这一行:

error_reporting = E_ALL

并替换为:

error_reporting = E_ALL ^ E_DEPRECATED

如果您无法访问配置文件,可以将此行添加到php wordpress文件(可能是headers.php):

error_reporting(E_ALL ^ E_DEPRECATED);