【问题标题】:Android/JSON: org.json.JSONException: Value of type java.lang.String cannot be converted to JSONObjectAndroid/JSON:org.json.JSONException:java.lang.String 类型的值无法转换为 JSONObject
【发布时间】:2014-10-09 16:28:12
【问题描述】:

当我尝试使用托管在00webhost.com. 上的PHP 脚本将我的SQLite DB 的内容上传到相应的MYSQL 数据库时,我发现标题中的错误

我还得到了 toast 输出:"Error while uploading. Please try again later.",这表明正在调用 LongOperation 类(如下所示)。

我问了一个非常相似的问题,问题是登录详细信息不正确。但是,此脚本并非如此。

下面的代码有什么问题?

第 1 步:在 onCreate() 中从 SQLite 数据库中获取值

Cursor cur = loginDataBaseAdapter.getSinlgeEntry();

            if (cur != null) {

                cur.moveToFirst();

                while (cur.isAfterLast() == false) {

                    String sessionId = cur.getString(cur
                            .getColumnIndex("sessionid"));
                    String game = cur.getString(cur.getColumnIndex("game"));
                    String name = cur.getString(cur.getColumnIndex("name"));
                    int avgAttention = Integer.parseInt(cur.getString(cur
                            .getColumnIndex("avgattention")));
                    int avgMediation = Integer.parseInt(cur.getString(cur
                            .getColumnIndex("avgmeditation")));
                    int maxAttention = Integer.parseInt(cur.getString(cur
                            .getColumnIndex("maxattention")));
                    int maxMediation = Integer.parseInt(cur.getString(cur
                            .getColumnIndex("maxmeditation")));
                    int score = Integer.parseInt(cur.getString(cur
                            .getColumnIndex("score")));
                    String date = cur.getString(cur.getColumnIndex("date"));

                    if (!sessionId.equals(null))
                        UploadDataAuto(sessionId, game, name,
                                avgAttention, avgMediation, maxAttention,
                                maxMediation,score, date);
                    // }

                    cur.moveToNext();
                }

            }
        }

上面调用的UploadDataAuto方法:

public void UploadDataAuto(String sessionId, String game, String name,
            Integer score, Integer avgAttn, Integer avgMed, Integer maxAttn,
            Integer maxMed, String date){

        // Defined URL where to send data
        String ServerUrl = "http://ry.net16.net/gameRegistration.php?sessionId="
                + sessionId
                + "&game="
                + game
                + "&name="
                + name
                + "&avgMed="
                + avgMed
                + "&maxMed="
                + maxMed
                + "&avgAttn="
                + avgAttn
                + "&maxAttn="
                + maxAttn
                + "&score="
                + score
                + "&date="
                + date
                + "";

        LongOperation longOperation = new LongOperation();
        longOperation.sessionId = sessionId;
        longOperation.execute(ServerUrl);

    }

私有类 LongOperation(在上面的方法中调用):

private class LongOperation extends AsyncTask<String, String, Void> {

        // Required initialization
        private final HttpClient Client = new DefaultHttpClient();
        private String Content;
        private String Error = null;
        private ProgressDialog Dialog = new ProgressDialog(LoginHome.this);
        String data = "";
        int sizeData = 0;
        public String sessionId = "";

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

            // Start Progress Dialog (Message)

            Dialog.setMessage("Please wait.. Data is uploading .");
            Dialog.show();

        }

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

            /************ Make Post Call To Web Server ***********/
            BufferedReader reader = null;

            // Send data
            try {

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

                // 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 null;
        }

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

            // Close progress dialog
            Dialog.dismiss();

            if (Error != null) {

                // uiUpdate.setText("Output : "+Error);

            } else {

                // Show Response Json On Screen (activity)
                // uiUpdate.setText( Content );

                /****************** Start Parse Response JSON Data *************/

                String OutputData = "";
                JSONObject jsonResponse;

                try {

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

                    String result = jsonResponse.get("result").toString();

                    if (result.equals("true")) {

                        //loginDataBaseAdapter.deleteUploadedRecord(sessionId);

                        Toast.makeText(LoginHome.this,
                                "Data is successfully uploaded.",
                                Toast.LENGTH_LONG).show();

                    } else {
                        Toast.makeText(
                                LoginHome.this,
                                "Error while uploading. Please try again later.",
                                Toast.LENGTH_LONG).show();
                    }

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

                catch (JSONException e) {

                    e.printStackTrace();
                }

            }
        }

    }

来自 URL 的相应 PHP 脚本(已删除登录详细信息):

<?php

if(isset($_GET['sessionId']) && isset($_GET['game']) && isset($_GET['name']) && isset($_GET['avgMed']) && isset($_GET['maxMed']) && isset($_GET['avgAttn']) && isset($_GET['maxAttn']) && isset($_GET['score']) && isset($_GET['date'])  )
{

$mysql_host = "";
$mysql_database = "";
$mysql_user = "";
$mysql_password = "";


    // Provide host ip, mysql user name, password
    $con = mysql_connect($mysql_host,$mysql_user,$mysql_password);

    // Provide database name.
    mysql_select_db($mysql_database);

    $sessionId=$_GET['sessionId'];

    $game=$_GET['game'];

    $name=$_GET['name'];

    $avgMed=$_GET['avgMed'];

    $maxMed=$_GET['maxMed'];

    $avgAttn=$_GET['avgAttn'];

    $maxAttn=$_GET['maxAttn'];

    $score=$_GET['score'];

    $date=$_GET['date'];


    $flag="false";


    if(!empty($game) && !empty($name) && !empty($date) && !empty($sessionId))
    {

        $sql="Insert into `GameDetails` (`SessionId`,`game`,`name`,`AvgMediation`,`MaxMediation`,`AvgAttention` ,`MaxAttention`,`Score`,`Date`) values ('$sessionId','$game','$name','$avgMed','$maxMed','$avgAttn','$maxAttn','$score','$date') ";

        $result=mysql_query($sql);

        if($result)
        {
            $count= mysql_affected_rows();
            if($count > 0)
            {
                $flag="true"; //result true 

            }               

        }

        mysql_close($con);  

        echo json_encode(array("result"=>$flag));
    }
}

?>  

完整的 Logcat 错误:

 08-15 22:48:10.907: W/System.err(20233): org.json.JSONException: Value <!-- of type java.lang.String cannot be converted to JSONObject
    08-15 22:48:10.907: W/System.err(20233):    at org.json.JSON.typeMismatch(JSON.java:111)
    08-15 22:48:10.907: W/System.err(20233):    at org.json.JSONObject.<init>(JSONObject.java:159)
    08-15 22:48:10.907: W/System.err(20233):    at org.json.JSONObject.<init>(JSONObject.java:172)
    08-15 22:48:10.907: W/System.err(20233):    at com.example.brianapp.LoginHome$LongOperation.onPostExecute(LoginHome.java:259)
    08-15 22:48:10.907: W/System.err(20233):    at com.example.brianapp.LoginHome$LongOperation.onPostExecute(LoginHome.java:1)
    08-15 22:48:10.907: W/System.err(20233):    at android.os.AsyncTask.finish(AsyncTask.java:632)
    08-15 22:48:10.907: W/System.err(20233):    at android.os.AsyncTask.access$600(AsyncTask.java:177)
    08-15 22:48:10.907: W/System.err(20233):    at android.os.AsyncTask$InternalHandler.handleMessage(AsyncTask.java:645)
    08-15 22:48:10.907: W/System.err(20233):    at android.os.Handler.dispatchMessage(Handler.java:102)
    08-15 22:48:10.907: W/System.err(20233):    at android.os.Looper.loop(Looper.java:157)
    08-15 22:48:10.907: W/System.err(20233):    at android.app.ActivityThread.main(ActivityThread.java:5356)
    08-15 22:48:10.907: W/System.err(20233):    at java.lang.reflect.Method.invokeNative(Native Method)
    08-15 22:48:10.907: W/System.err(20233):    at java.lang.reflect.Method.invoke(Method.java:515)
    08-15 22:48:10.907: W/System.err(20233):    at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:1265)
    08-15 22:48:10.907: W/System.err(20233):    at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:1081)
    08-15 22:48:10.907: W/System.err(20233):    at dalvik.system.NativeStart.main(Native Method)

【问题讨论】:

  • 您可以发布您尝试解析的 JSON 字符串吗?

标签: php android mysql json sqlite


【解决方案1】:

看起来您想使用非 JSON 字符串创建一个新的 JSONObject。看起来这发生在onPostExecute()

jsonResponse = new JSONObject(Content);

Content 可能没有 JSON。

【讨论】:

  • 确保服务器返回有效的 JSON。现在它可能会返回某种错误(404 或其他)或网页。
【解决方案2】:

尝试替换

private class LongOperation extends AsyncTask<String, String, Void>

通过

private class LongOperation extends AsyncTask<String, String, String>

protected Void doInBackground(String... urls) 

通过

protected String doInBackground(String... urls) 

最后

protected void onPostExecute(Void unused) 

通过

protected void onPostExecute(String str)
{

    try
      {

         jsonResponse = new JSONObject(str);
         // rest of your code
      }
      catch (Exception e)
      {}

}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2023-03-10
    • 2020-03-04
    • 2021-10-23
    • 2016-08-28
    • 2017-11-23
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多