org.json.JSONException:无状态值 [英] org.json.JSONException: No value for status

查看:182
本文介绍了org.json.JSONException:无状态值的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

org.json.JSONException:无状态值

这是我用于json解析的Java代码方法

Here is my java code method for json parse

java

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

        }

将参数传递给android jsonobject的Php文件

Php file to pass parameter to android jsonobject

stitle1.php

stitle1.php

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);
    ?>

当我运行我的应用程序时,这些行将显示在logcat面板上

When I run my application these lines appear on logcat panel

I/测试:值:4

I/测试:org.json.JSONException:无状态值

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

这是两行出现在logcat上,表明有关该参数未正确发送的错误

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

推荐答案

我们将逐步执行此步骤.让我们从回应开始.

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

您的PHP代码返回一个status值= 4,表示您没有正确地将参数发送到PHP代码.可能甚至没有调用getParams().

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.

getParams()方法更改为如下所示:

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:

现在,无论您的php代码如何响应,您都将获得格式正确的JSONObject作为响应,您可以对其进行解析并对其进行适当的反应.

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.

更改代码的onResponse()部分,使其看起来像这样:

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

现在解析JSONObject:

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

这篇关于org.json.JSONException:无状态值的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆