Welcome to OStack Knowledge Sharing Community for programmer and developer-Open, Learning and Share
Welcome To Ask or Share your Answers For Others

Categories

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

java - org.json.JSONException: No value for status

org.json.JSONException: No value for status

Here is my java code method for json parse

java

public void performSearch() {
            String url= "http://192.168.0.136/fyp/stitle1.php";
            RequestQueue requestQueue = Volley.newRequestQueue(Stitle.this);
           JsonObjectRequest jsObjRequest = new JsonObjectRequest(Request.Method.POST,url,null,
                   new Response.Listener<JSONObject>() {
               @Override
               public void onResponse(JSONObject response) {
                   Log.d("Response", response.toString());
                   try {
                       //converting the string to json array object
                       JSONObject array = new JSONObject();
                       //Log.i("test", " value : " + array.getString("status"));
                       Log.i("test", " value : " + response.getString("status"));
                       if (array.getString("status").equals("true")) {
                           JSONArray jsonArray = array.getJSONArray("search");
                           Log.i("test", " value : " + array);

                           for (int i = 0; i < jsonArray.length(); i++) {

                               //getting product object from json array
                               JSONObject product = jsonArray.getJSONObject(i);

                               //adding the product to product list
                               boolean add = productList.add(new list(
                                       product.getLong("isbn"),
                                       product.getString("title"),
                                       product.getString("authors"),
                                       product.getInt("accession"),
                                       product.getString("publisher"),
                                       product.getInt("pubyear"),
                                       product.getInt("pages"),
                                       product.getInt("rak"),
                                       product.getInt("hr"),
                                       product.getInt("vr"),
                                       product.getLong("barcode")

                               ));

                           }

                       } else {
                           Log.i("test", "else error");

                       }


                   } catch (JSONException e) {
                       e.printStackTrace();
                       Log.i("test", e.toString());
                   }
               }

           }, new Response.ErrorListener() {
               @Override
               public void onErrorResponse(VolleyError error) {
                   Toast.makeText(getApplicationContext(), "error:" + error.toString(), Toast.LENGTH_LONG).show();

               }
           }) {
               @Override
               protected Map<String, String> getParams() throws AuthFailureError {

                   Map<String, String> params = new HashMap<>();
                   params.put("Title", searchtitle.getText().toString());

                   return params;
               }
           };
           requestQueue = Volley.newRequestQueue(Stitle.this);
           requestQueue.add(jsObjRequest);

        }

Php file to pass parameter to android jsonobject

stitle1.php

php

<?php

 // array for JSON response
   $response = array();
  //set values just in case any thing goes wrong
  $response["status"] = 0;
 $response["message"] = "Error before start";

// check for post data with isset
 if (isset($_POST["Title"])) {

$title = $_POST["Title"];

// You were not using PDO so I dumped your connection and require you to provide...
//...a configuration file for ...
require_once 'connection.php';
// ...these  variables
$host = 'localhost';
$db   = 'fyp';
$user = 'root';
$pass = '';
$charset = 'utf8';

$dsn = "mysql:host=$host;dbname=$db;charset=$charset";
$opt = [
    PDO::ATTR_ERRMODE            => PDO::ERRMODE_EXCEPTION,
    PDO::ATTR_DEFAULT_FETCH_MODE => PDO::FETCH_ASSOC,
    PDO::ATTR_EMULATE_PREPARES   => false,
];

try{
    // connecting to db with PDO
    $pdo = new PDO($dsn, $user, $pass, $opt);


    $sql = 'SELECT isbn, title, authors, accession, publisher, pubyear, pages, rak, hr, vr, barcode
            FROM books 
            WHERE title LIKE :titleParam';

    $titleParam = "%".$title."%";

    $stmt = $pdo->prepare($sql);

    // Bind the parameter
    $stmt->bindParam(':titleParam', $titleParam, PDO::PARAM_STR);

    $res = $stmt->execute();

    if ($res) {
        // success
        $response["status"] = 1;
        // connection node
        $response["books"] = array();

        while ($row = $stmt->fetch(PDO::FETCH_ASSOC)) {
            $data = array();
            $data["isbn"] = $row["isbn"];
            $data["title"] = $row["title"];
            $data["authors"] = $row["authors"];
            $data["accession"] = $row["accession"];
            $data["publisher"] = $row["publisher"];
            $data["pubyear"] = $row["pubyear"];
            $data["pages"] = $row["pages"];
            $data["rak"] = $row["rak"];
            $data["hr"] = $row["hr"];
            $data["vr"] = $row["vr"];
            $data["barcode"] = $row["barcode"];

            array_push($response["books"], $data);
        }
    }
    else {
        // required field is missing
        $response["status"] = 2;
        $response["message"] = "No data returned";
    }   
}
catch (Exception $e){
    $response["status"] = 3;
    $response["message"] = "Error occurred." . $e->getMessage();
    }
  }
   else {
      $response["status"] = 4;
        $response["message"] = "Post parameters are not correct";
    }
      // echoing JSON response
      echo json_encode($response);
    ?>

When I run my application these lines appear on logcat panel

I/test: value : 4

I/test: org.json.JSONException: No value for status

These are two lines appear on logcat which indicate error about that the parameter was not sent properly

See Question&Answers more detail:os

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

1 Answer

0 votes
by (71.8m points)

We will take this step for step. Lets start with response.

Your PHP code is returning a status value =4 which indicates that you are not getting the parameters sent to the PHP code properly. It is possible that getParams() is not even being called.

Change the getParams() method to look like this:

@Override
protected Map<String, String> getParams() throws AuthFailureError {
    Map<String, String> params = new HashMap<>();
    try{
        String s = searchtitle.getText().toString();
        Log.e("Volley request", "getParams called : " + s);
        params.put("Title", s);
    }
    catch(Exception ex){
        Log.e("Volley request ERROR", ex.getMessage());
    }
    return params;
}

For the second part, lets try to deal with the parsing code. Change the code to look like this:

Now regardless of how your php code responds, you will be getting a well formed JSONObject as a response which you can parse and react to it appropriately.

Change the onResponse() part of the code to look like this:

@Override
public void onResponse(JSONObject response) {
    // Log.d("Response", response.toString());
    try {
        //converting the string to json array object
        if(response != null){
            if(!response.has("status"){
                Log.e(TAG, "Something went wrong -- no status key!");
                return;
            }
            else{
                int status = response.optInt("status", -1);
                if(status == 1){
                    //There could be quite a few books in this response...
                    //...you might want to parse in an AsyncTask instead
                    parseJsonObject(response);
                }
                else{
                    String message = response.optString("message", "uups");
                    Log.e(TAG, "error message = " + message);
                    return;
                }
            }
        }
    }
    catch(Exception ex){
        Log.e(TAG, ex.getMessage());
    }
}

And now to parse the JSONObject:

Map<String, String> booksMap = new HashMap<>();

    private void parseJsonObject(JSONObject jsonObject){
        try{
            if(jsonObject == null) return;
            //Not Available!
            String na = "NA"

            Log.i("test", " value : " + jsonObject.toString());
            if(jsonObject.has("books")){
                JSONArray array = jsonObject.getJSONArray("books");
                for(int i = 0; array.length(); i++){
                    JSONObject book = array.getJSONObject(i);
                    Iterator<String> it = book.keys();
                    while(it.hasNext()){
                        String key = it.next();
                        String value = book.optString(key, na);
                        booksMap.put(key, value);
                    }
                }
            }
        }
        catch(Exception ex){
            Log.e(TAG, ex.getMessage());
        }
    }

与恶龙缠斗过久,自身亦成为恶龙;凝视深渊过久,深渊将回以凝视…
Welcome to OStack Knowledge Sharing Community for programmer and developer-Open, Learning and Share
Click Here to Ask a Question

...