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

时间:2014-09-02 18:13:01

标签: java php android mysql json

当我尝试通过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>
";
}
?>

有人能帮助我吗?

提前致谢!

1 个答案:

答案 0 :(得分:0)

这是一个很糟糕的API设计,我不知道是谁写了这个教程,每当我看到有人使用它时,就会发生同样的问题。

您正在编写Android应用程序,不应该涉及HTML,当字段丢失时,您仍应返回json数据和 HTML表单。

仔细阅读错误:

  

“解析数据时出错org.json.JSONException:类型的值&lt; form   java.lang.String无法转换为JSONObject“

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