Welcome to OGeek Q&A Community for programmer and developer-Open, Learning and Share
Welcome To Ask or Share your Answers For Others

Categories

0 votes
2.6k views
in Technique[技术] by (71.8m points)

php - JSONException: Value of type java.lang.String cannot be converted to JSONObject

I am facing a problem, a valid JSON string cannot become a JSON object.

I have tested the response coming from the server, it is a valid JSON.

I have checked on the internet, it is about the problem of UTF-8 with DOM. But even I changed the charset in Notepad++ into UTF-8 with no DOM, the same error still coming out.

My codes:

<?php
    require_once("Connection/conn.php");


    //parse JSON and get input
    $json_string = $_POST['json'];
    $json_associative_array = json_decode($json_string,true);

    $userId = $json_associative_array["userId"];
    $password = $json_associative_array["password"];
    $userType = $json_associative_array["userType"];    

    //get the resources
    $json_output_array = array();

    $sql = "SELECT * FROM account WHERE userId = '$userId' AND password = '$password' AND userType = '$userType'";  
    $result = mysql_query($sql);  

    //access success?
    if (!$result) {
        die('Invalid query: ' . mysql_error());
        $json_output_array["status"] = "query failed";
    }
    else{
        $json_output_array["status"] = "query success";
    }

    //find the particular user?
    if (mysql_num_rows($result) > 0){
        $json_output_array["valid"] = "yes";
    }
    else{
        $json_output_array["valid"] = "no";
    }

    //output JSON 
    echo json_encode($json_output_array);
?>

Android codes:

public boolean login() {
        // instantiates httpclient to make request
        DefaultHttpClient httpClient = new DefaultHttpClient();

        // url with the post data
        String url = SERVER_IP + "/gc/login.php";

        JSONObject holder = new JSONObject();
        try {
            holder.put("userId", "S1");
            holder.put("password", "s12345");
            holder.put("userType", "supervisor");
        } catch (JSONException e1) {
            // TODO Auto-generated catch block
            e1.printStackTrace();
        }

        Log.d("JSON", holder.toString());


        // HttpPost
        HttpPost httpPost = new HttpPost(url);


        //FormEntity
        ArrayList<NameValuePair> nameValuePairs = new ArrayList<NameValuePair>();
        nameValuePairs.add(new BasicNameValuePair("json", holder.toString()));

        try {
            httpPost.setEntity(new UrlEncodedFormEntity(nameValuePairs));
        } catch (UnsupportedEncodingException e1) {
            // TODO Auto-generated catch block
            e1.printStackTrace();
        }

        // execution and response
        boolean valid = false; 
        try {
            HttpResponse response = httpClient.execute(httpPost);

            Log.d("post request", "finished execueted");
            String responseString = getHttpResponseContent(response);
            Log.d("post result", responseString);

            //parse JSON
            JSONObject jsonComeBack = new JSONObject(responseString);
            String validString = jsonComeBack.getString("valid");
            valid = (validString.equals("yes"))?true:false;

        } catch (ClientProtocolException e) {
            e.printStackTrace();
        } catch (IOException e) {
            e.printStackTrace();
        } catch (JSONException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }



        return valid;

    }

    private String getHttpResponseContent(HttpResponse response) {

        String responseString = "";

        try {
            BufferedReader rd = new BufferedReader(new InputStreamReader(
                    response.getEntity().getContent()));

            String line = "";

            while ((line = rd.readLine()) != null) {
                responseString += line ;
            }
            rd.close();
        } catch (IOException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }

        return responseString;
    }

JSON come from server:

{
    "status": "query success",
    "valid": "yes"
}

unformat JSON:

{"status":"query success","valid":"yes"}

When I copy this into notepad++, it becomes ?{"status":"query success","valid":"yes"} It seems that there is a invisible character .

See Question&Answers more detail:os

与恶龙缠斗过久,自身亦成为恶龙;凝视深渊过久,深渊将回以凝视…
Welcome To Ask or Share your Answers For Others

1 Reply

0 votes
by (71.8m points)

I fixed it with the solution provided by MuhammedPasha, which substring the JSON string to remove invisible character. And I substring the JSON String from 1 to fix my problem.

There is a way to detect those invisible characters, copy the log result into notepad++.(copy! no typing!) If there are any ?(question mark), they indicates that there are some invisible character.


与恶龙缠斗过久,自身亦成为恶龙;凝视深渊过久,深渊将回以凝视…
OGeek|极客中国-欢迎来到极客的世界,一个免费开放的程序员编程交流平台!开放,进步,分享!让技术改变生活,让极客改变未来! Welcome to OGeek Q&A Community for programmer and developer-Open, Learning and Share
Click Here to Ask a Question

...