Org.json.JSONException: нет значения для статуса

org.json.JSONException: нет значения для статуса

Вот мой метод java-кода для разбора json

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 для передачи параметра в jsonobject Android

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

Вы получаете сообщение об ошибке из-за этой строки :: if (array.getString("status").equals("true")) { :: Вы все еще спрашиваете array, который пуст. Вам нужен response.getString(...

Barns 30.05.2018 01:21

Теперь это после использования response.get ... I / test: value: 4 else error

Asad Mallick 30.05.2018 01:28
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
В компьютерном программировании биты играют важнейшую роль в представлении и манипулировании данными на двоичном уровне. Побитовые операции...
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Приходилось ли вам сталкиваться с требованиями, в которых вас могли попросить поднять тревогу или выдать ошибку, когда метод Java занимает больше...
Полный курс Java для разработчиков веб-сайтов и приложений
Полный курс Java для разработчиков веб-сайтов и приложений
Получите сертификат Java Web и Application Developer, используя наш курс.
2
2
516
1

Ответы 1

Мы сделаем этот шаг за шагом. Начнем с ответа.

Ваш PHP-код возвращает значение status = 4, которое указывает на то, что вы не получаете параметры, отправленные в PHP-код должным образом. Возможно, что getParams() даже не называют.

Измените метод getParams(), чтобы он выглядел так:

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

Во второй части попробуем разобраться с кодом парсинга. Измените код, чтобы он выглядел так:

Теперь, независимо от того, как реагирует ваш php-код, вы получите хорошо сформированный JSONObject в качестве ответа, который вы можете проанализировать и соответствующим образом отреагировать на него.

Измените часть кода onResponse(), чтобы она выглядела так:

@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:

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

Да, этот код не пытается исправить ошибку. Не беспокойтесь об ошибке. Параметры POST важны. Используйте приведенный выше код и посмотрите, что отображается в журнале относительно параметров «Запрос залпа». Это отображается?

Barns 30.05.2018 01:38

опять та же ошибка I / тест: значение: 4 ------ иначе ошибка

Asad Mallick 30.05.2018 01:43

Кстати: «TAG» - это переменная класса, которая выглядит следующим образом: private static final String TAG = YourActivity.class.getSimpleName(); Обратите внимание, что вам нужно изменить YourActivity на имя класса фактического имени класса.

Barns 30.05.2018 01:48

@AsadMallick :: Посмотрите, как изменился ответ. Вы можете использовать этот код, и ошибка исчезнет. Сообщите мне, поможет ли это избавиться от ошибки.

Barns 30.05.2018 02:19

@AsadMallick :: Вы видели изменения в ответе?

Barns 31.05.2018 19:56

Другие вопросы по теме