Volley.parsererror: org.json.JSONException: значение br типа java.lang.string не может быть преобразовано в JSONObject

volley.parsererror: org.json

value br of type java.lang.string cannot be converted to JSONObject

Код Android

public void performSearch() {
            String url= "http://192.168.0.136/fyp/stitle.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.i("Response", response.toString());
                   try {
                       //converting the string to json array object
                       JSONObject array = new JSONObject();
                       Log.i("test", " value : " + array.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 Code file to send json to android java file

    <?php
include"connection.php";

   if (isset($title = $_POST["Title"]){

if ($conn->connect_error) {
    die("Connection failed: " . $conn->connect_error);
} 

$query =$conn->prepare('SELECT isbn, title, authors, accession, publisher, pubyear, pages, rak, hr, vr, barcode FROM books where title like "%'.$title.'%" ');

$query->execute();

$query->bind_result($isbn, $title, $authors, $accession, $publisher, $pubyear, $pages, $rak, $hr, $vr, $barcode);


$books = array(); 
$data =array();
//traversing through all the result 
    while($query->fetch()){
    $temp = array();
    $temp['isbn'] = $isbn; 
    $temp['title'] = $title; 
    $temp['authors'] = $authors; 
    $temp['accession'] = $accession; 
    $temp['publisher'] = $publisher; 
    $temp['pubyear'] = $pubyear; 
    $temp['pages'] = $pages; 
    $temp['rak'] = $rak; 
    $temp['hr'] = $hr; 
    $temp['vr'] = $vr; 
    $temp['barcode'] = $barcode;

    array_push($data, $temp);

    }
    $books['status'] = true;
    $books['search'] = $data;



    //displaying the result in json format 
    echo json_encode($books);
}}
?>

When run applicaion this error toast on screen [volley.parsererror:org.json.JSONException: value br of type java.lang.string cannot be converted to JSONArray]

Зарегистрируйте свой результат в logcat, чтобы вы могли увидеть возвращаемый ответ JSON, а затем опубликуйте образец данных.

Barns 28.05.2018 00:23

Вы должны быть проинформированы, что ваш PHP-код открыт для SQL-инъекций! Вы также должны проверить свои параметры POST с помощью isset и, таким образом, дать вашему PHP-коду элегантный выход, если параметр не установлен должным образом.

Barns 28.05.2018 00:28

Нет ответа JSON на logcat. Ошибка на экране. @Barns

Asad Mallick 28.05.2018 02:35

В вашем коде есть несколько проблем. Слишком много, чтобы охватить одним вопросом. Но, во-первых, ваш PHP не предназначен для возврата JSONArray! Он предназначен для возврата JSONObject. Во-вторых, ваш PHP-код плохо спроектирован и, кроме того, открыт для атак с использованием SQL-инъекций! Вы должны использовать подготовленный оператор каждый раз, когда используете переменные для фильтрации набора результатов. Вы должны использовать isset для своих параметров POST. Вы должны вернуть некоторый тип правильно сформированного ответа JSON, если ваш PHP-код не работает по какой-либо причине. После того, как это будет исправлено, мы можем приступить к работе с кодом Android.

Barns 28.05.2018 03:50

Привет @Barns .. Теперь я меняю свой код на JSONObject и php на исет. Но появляется такая же ошибка .. Я плохо кодирую помощь

Asad Mallick 29.05.2018 23:28

Без сомнения, вы возвращаете что-то, что не является JSON, пожалуйста, реструктурируйте свой код, а затем с вашего URL-сервера убедитесь, что вы его протестировали и у вас есть файл json.

Joel Wembo 29.05.2018 23:35
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
В компьютерном программировании биты играют важнейшую роль в представлении и манипулировании данными на двоичном уровне. Побитовые операции...
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Приходилось ли вам сталкиваться с требованиями, в которых вас могли попросить поднять тревогу или выдать ошибку, когда метод Java занимает больше...
Полный курс Java для разработчиков веб-сайтов и приложений
Полный курс Java для разработчиков веб-сайтов и приложений
Получите сертификат Java Web и Application Developer, используя наш курс.
0
6
1 092
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

В вашем коде есть несколько проблем. Давайте сначала займемся вашим PHP. Ваш PHP-код должен быть разработан так, чтобы возвращать некоторую полезную информацию, независимо от того, успешен он или нет, и почему он не работает.

Я не могу сказать, какой класс вы используете для доступа к данным MySQL, но в любом случае это не PDO. Я покажу вам пример использования PDO, потому что вы можете использовать подготовленные операторы, которые помогут защитить вас от атак SQL-инъекций. ваш PHP-код плохо спроектирован и, кроме того, открыт для атак с использованием SQL-инъекций!

Начните свой PHP-код с проверки isset ваших параметров. Этот код вернет JSONObject независимо от того, завершился ли ваш запрос ошибкой. Это упрощает понимание того, что идет не так - а когда что-то идет не так.

<?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 __DIR__ . '/db_config.php';
    // ...these  variables
    $host = DB_SERVER;
    $db   = DB_DATABASE;
    $user = DB_USER;
    $pass = DB_PASSWORD;
    $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> org.json.JSONException: нет значения для статуса

Asad Mallick 30.05.2018 00:19

Это потому, что у вас есть это в вашем коде JSONObject array = new JSONObject(); Log.i("test", " value : " + array.getString("status")); :: Вы создаете новый объект array, но в нем ничего нет! :: Вам нужно написать это: Log.i("test", " value : " + response.optInt("status", -1));

Barns 30.05.2018 00:23

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

Asad Mallick 30.05.2018 00:29

Похоже, что значение статуса равно «4», что в соответствии с кодом PHP будет означать, что параметр не был отправлен должным образом.

Barns 30.05.2018 00:37

Теперь, как я правильно отправляю параметр

Asad Mallick 30.05.2018 00:43

Пожалуйста, оставьте комментарий здесь, когда вы разместите свой новый вопрос.

Barns 30.05.2018 00:49

(stackoverflow.com/questions/50594284/…)

Asad Mallick 30.05.2018 01:18

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