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]
Вы должны быть проинформированы, что ваш PHP-код открыт для SQL-инъекций! Вы также должны проверить свои параметры POST с помощью isset и, таким образом, дать вашему PHP-коду элегантный выход, если параметр не установлен должным образом.
Нет ответа JSON на logcat. Ошибка на экране. @Barns
В вашем коде есть несколько проблем. Слишком много, чтобы охватить одним вопросом. Но, во-первых, ваш PHP не предназначен для возврата JSONArray! Он предназначен для возврата JSONObject. Во-вторых, ваш PHP-код плохо спроектирован и, кроме того, открыт для атак с использованием SQL-инъекций! Вы должны использовать подготовленный оператор каждый раз, когда используете переменные для фильтрации набора результатов. Вы должны использовать isset для своих параметров POST. Вы должны вернуть некоторый тип правильно сформированного ответа JSON, если ваш PHP-код не работает по какой-либо причине. После того, как это будет исправлено, мы можем приступить к работе с кодом Android.
Привет @Barns .. Теперь я меняю свой код на JSONObject и php на исет. Но появляется такая же ошибка .. Я плохо кодирую помощь
Без сомнения, вы возвращаете что-то, что не является JSON, пожалуйста, реструктурируйте свой код, а затем с вашего URL-сервера убедитесь, что вы его протестировали и у вас есть файл json.




В вашем коде есть несколько проблем. Давайте сначала займемся вашим 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: нет значения для статуса
Это потому, что у вас есть это в вашем коде JSONObject array = new JSONObject(); Log.i("test", " value : " + array.getString("status")); :: Вы создаете новый объект array, но в нем ничего нет! :: Вам нужно написать это: Log.i("test", " value : " + response.optInt("status", -1));
I / test: значение: 4 I / test: org.json.JSONException: нет значения для статуса
Похоже, что значение статуса равно «4», что в соответствии с кодом PHP будет означать, что параметр не был отправлен должным образом.
Теперь, как я правильно отправляю параметр
Пожалуйста, оставьте комментарий здесь, когда вы разместите свой новый вопрос.
(stackoverflow.com/questions/50594284/…)
Зарегистрируйте свой результат в logcat, чтобы вы могли увидеть возвращаемый ответ JSON, а затем опубликуйте образец данных.