java.lang.String 类型的值在 android 上无法转换为 JSONObject

声明:本页面是StackOverFlow热门问题的中英对照翻译,遵循CC BY-SA 4.0协议,如果您需要使用它,必须同样遵循CC BY-SA许可,注明原文地址和作者信息,同时你必须将它归于原作者(不是我):StackOverFlow 原文地址: http://stackoverflow.com/questions/23111640/
Warning: these are provided under cc-by-sa 4.0 license. You are free to use/share it, But you must attribute it to the original authors (not me): StackOverFlow

提示:将鼠标放在中文语句上可以显示对应的英文。显示中英文
时间:2020-08-20 06:47:46  来源:igfitidea点击:

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

androidjson

提问by Aakash

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

这是我的 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 code:i have used a array in this.suggest me why type mismatch occuring

PHP 代码:我在这个中使用了一个数组。建议我为什么会发生类型不匹配

<?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.access0(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)

This is the all content is returning.....in log...

这是所有内容正在返回.....在登录...

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"}]}

still returning this much part of html code..i need only code part from {"Android"} onwards...i.e the last line only..

仍然返回 html 代码的大部分......我只需要从 {"Android"} 开​​始的代码部分......即只需要最后一行......

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"}]}

回答by Joffrey

About your HTML

关于你的 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:

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

interpreted HTML response

解释的 HTML 响应

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

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



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.

如果您想知道 的解析出了什么问题Content,您可能想记录该字符串并查看它的外观。

Apparently, Contentis 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.

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



UPDATE:

更新:

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

好的,根据您发布的内容,您的Content字符串包含 JSON 字符串(用大括号括起来的字符串{}),但它还包含需要删除的 HTML 部分。

Put this code before you try to create the JSONObject:

在尝试创建之前放置此代码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:

更新 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 fonttag before running the previous snippet:

前面的代码片段似乎不够充分,因为您的 HTML 包含大括号 ( {})。如果服务器总是返回那种 HTML,你可能只想在运行之前的代码片段之前去掉font标签:

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.

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

回答by shaligram prakash

You have to edit the php configuration file.

您必须编辑php配置文件。

Find the line:

找到这一行:

error_reporting = E_ALL

and replace with:

并替换为:

error_reporting = E_ALL ^ E_DEPRECATED

If you don't have access to the configuration file you can add this line to the php wordpress file (maybe headers.php):

如果您无权访问配置文件,则可以将此行添加到 php wordpress 文件(也许headers.php):

error_reporting(E_ALL ^ E_DEPRECATED);