【问题标题】:Error parsing JSON data, org.json.jsonexception, java.lang.String can not be converted [closed]解析JSON数据时出错,org.json.jsonexception,java.lang.String无法转换[关闭]
【发布时间】:2014-09-02 18:13:01
【问题描述】:

当我尝试通过 PHP 将分数更新到 MYSQL 时,LogCat 出现错误。 给定的错误: “解析数据 org.json.JSONException 时出错:值

这是我的代码:

更新分数的安卓代码:

int scoreEL;
String username;


if(DifficultyMenu.scoreEL1 < scoreEL1){
            new UpdateScores().execute();

        }




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

    @Override
    protected String doInBackground(String... args) {
        // TODO Auto-generated method stub
       int success;
       try {
           List<NameValuePair> params = new ArrayList<NameValuePair>();
           params.add(new BasicNameValuePair("username", username));
           params.add(new BasicNameValuePair("stars", String.valueOf(scoreEL1)));

           Log.d("request!", "starting");

           JSONObject json = jsonParser.makeHttpRequest(
                  LOGIN_URL_1, "POST", params);

           Log.d("Login attempt", json.toString());

           success = json.getInt(TAG_SUCCESS);
           if (success == 1) {
            Log.d("Updated successful!", json.getString(TAG_MESSAGE));

            finish();
            return json.getString(TAG_MESSAGE);
           }else{
            Log.d("Login Failure!", json.getString(TAG_MESSAGE));
            return json.getString(TAG_MESSAGE);

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

       return null;

 }

JSONParser 类:

public class JSONParser {

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

// constructor
public JSONParser() {

}


public JSONObject getJSONFromUrl(final String url) {

    // Making HTTP request
    try {
        // Construct the client and the HTTP request.
        DefaultHttpClient httpClient = new DefaultHttpClient();
        HttpPost httpPost = new HttpPost(url);

        // Execute the POST request and store the response locally.
        HttpResponse httpResponse = httpClient.execute(httpPost);
        // Extract data from the response.
        HttpEntity httpEntity = httpResponse.getEntity();
        // Open an inputStream with the data content.
        is = httpEntity.getContent();

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

    try {
        // Create a BufferedReader to parse through the inputStream.
        BufferedReader reader = new BufferedReader(new InputStreamReader(
                is, "iso-8859-1"), 8);
        // Declare a string builder to help with the parsing.
        StringBuilder sb = new StringBuilder();
        // Declare a string to store the JSON object data in string form.
        String line = null;

        // Build the string until null.
        while ((line = reader.readLine()) != null) {
            sb.append(line + "\n");
        }

        // Close the input stream.
        is.close();
        // Convert the string builder data to an actual string.
        json = sb.toString();
    } catch (Exception e) {
        Log.e("Buffer Error", "Error converting result " + e.toString());
    }

    // Try to 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 the JSON Object.
    return jObj;

}


// 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 JSON String
    return jObj;

}

}

PHP代码:

<?php
if($_POST['submit']){

$stars= $_POST['stars'];
$username = $_POST['username'];

$connect = mysql_connect("*****", "****", "*****") or die("Can't connect to database!");
mysql_select_db("a9698368_webserv") or die("Can't select database!");

try{

    $checkUsername = mysql_query("SELECT username FROM users WHERE username =      '$username'");
    $checkuser = mysql_fetch_assoc($checkUsername);
    if($username == $checkuser){
        $response["success"] = 0;
        $response["message"] = "User doesn't exist!";
        die(json_encode($response));
    }

}
catch (PDOException $ex) {
    $response["success"] = 0;
    $response["message"] = "Database Error. Please Try Again!";
    die(json_encode($response));
}


try{

mysql_query("
UPDATE users SET easy_level1 = '$stars' WHERE username = '$username'
");
}
catch (PDOException $ex) {
    $response["success"] = 0;
    $response["message"] = "Database Error. Please Try Again!";
    die(json_encode($response));
}

try{
$check = mysql_query("
SELECT easy_level1 FROM users WHERE username = '$username'
");
}
catch (PDOException $ex) {
    $response["success"] = 0;
    $response["message"] = "Can't check if the new score is successfully updated!";
    die(json_encode($response));
}

if($check !== $stars){
    $updated = true;
}

if ($updated) {
    $response["success"] = 1;
    $response["message"] = "Updated successful!";
    die(json_encode($response));
} else {
    $response["success"] = 0;
    $response["message"] = "Can't update the stars!";
    die(json_encode($response));
}

mysql_close();

}
else{

echo"
<form action='updateEL1.php' method='POST'>
Username: <input type='text' name='username'><br>
Stars: <input type='text' name='stars'><br>
<input type='submit' name='submit' value='Update'>
</form>
";
}
?>

有人可以帮帮我吗?

提前致谢!

【问题讨论】:

  • 也粘贴您的堆栈跟踪和 JSON
  • 此外,尝试将其固定为更短的代码。我非常怀疑你需要大约 250 行来证明这个问题。

标签: java php android mysql json


【解决方案1】:

这是一个糟糕的 API 设计,我想知道这个教程是谁写的,每次我看到有人使用它时都会出现同样的问题。

您正在编写一个 android 应用程序,应该不涉及 HTML,当缺少该字段时,您仍然应该返回 json 数据和 不是 HTML 表单。

仔细阅读错误:

"解析数据时出错 org.json.JSONException: Value

of type java.lang.String 无法转换为 JSONObject"

是的form是html标签,就是不满足条件。

那么如果你看条件

if($_POST['submit'])

这永远不会是真的,因为您的应用中没有 html 提交按钮。

您应该检查应用程序发送的值是否已设置,如果没有发送回 json 响应错误说明。


<?php
$response = array();

if(isset($_POST['stars'], $_POST['username'])){

    $stars= $_POST['stars'];
    $username = $_POST['username'];

    $connect = mysql_connect("*****", "****", "*****") or die("Can't connect to database!");
    mysql_select_db("a9698368_webserv") or die("Can't select database!");

    try{
        $query = sprintf("UPDATE users SET easy_level1 ='%s' WHERE username ='%s'",
                                     mysql_real_escape_string($stars),
                                     mysql_real_escape_string($username));
        mysql_query($query);
    }
    catch (Exception $ex) {
        $response["success"] = 0;
        $response["message"] = "Database Error. Please Try Again!";
    }


    if ( mysql_affected_rows() > 0) {
        $response["success"] = 1;
        $response["message"] = "Updated successful!";
    } else {
        $response["success"] = 0;
        $response["message"] = "Can't update the stars!";
    }
    mysql_close();

}
else{
    $response["success"] = 0;
    $response["message"] = "Missing post data!";
}
echo json_encode($response);
?>

【讨论】:

  • 感谢您的反应,您是对的!该按钮永远不会被点击......我从来没有想过这个!非常感谢!我将编辑代码!
  • 如果你想感谢我,请接受答案
  • 完成,我现在就修改按钮的代码!
  • 我已将 if($_POST['submit']) 更改为 if(!empty($_POST)) 但它仍然无法在应用程序中工作......但如果我去到我的网站并点击提交,它确实有效......你知道如何解决这个问题吗?
  • 因为你从不回显 JSON,为什么要运行这些 SELECT statemnet
猜你喜欢
  • 1970-01-01
  • 2013-09-07
  • 2015-12-25
  • 2013-02-10
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-08-11
相关资源
最近更新 更多