解析JSON数据时出错,org.JSON.jsonexception,java.lang.String无法转换


Error parsing JSON data, org.json.jsonexception, java.lang.String can not be converted

当我试图通过PHP将分数更新为MYSQL时,LogCat中出现了一个错误。给定的错误:"分析数据org.json.JSONException时出错:java.lang.String类型的值<形式无法转换为JSONObject"。我对此很陌生,所以我不知道如何解决。。。

这是我的代码:

更新分数的Android代码:

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

}

PHPcode:

<?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>
";
}
?>

有人能帮我吗?

提前感谢!

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

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

仔细阅读错误:

"分析数据org.json.JSONException时出错:类型的值<表单java.lang.String无法转换为JSONObject"

Yes表单是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);
?>