java.lang.string не может быть преобразован в JSONArray Android Mysql

Сегодня я пытаюсь отправить уведомления о наступлении срока оплаты для мобильного библиотечного приложения, но после входа в приложение появляется ошибка.

4: запустить java.lang.string невозможно преобразовать в JSONArray.

Мой PHP работает нормально, но как я могу исправить эту ошибку?

W/System.err: org.json.JSONException: Value <br of type java.lang.String cannot be converted to JSONArray
W/System.err:     at org.json.JSON.typeMismatch(JSON.java:111)
W/System.err:     at org.json.JSONArray.<init>(JSONArray.java:96)
W/System.err:     at org.json.JSONArray.<init>(JSONArray.java:108)
W/System.err:     at com.example.ivan.librarymobileapp.backWorkerNotif.doInBackground(backWorkerNotif.java:67)
W/System.err:     at com.example.ivan.librarymobileapp.backWorkerNotif.doInBackground(backWorkerNotif.java:23)
W/System.err:     at android.os.AsyncTask$2.call(AsyncTask.java:288)
W/System.err:     at java.util.concurrent.FutureTask.run(FutureTask.java:237)
W/System.err:     at android.os.AsyncTask$SerialExecutor$1.run(AsyncTask.java:231)
W/System.err:     at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1112)
W/System.err:     at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:587)
W/System.err:     at java.lang.Thread.run(Thread.java:818)

Вот мой код:

Класс backWorkerNotif

public class backWorkerNotif extends AsyncTask<String, String, String> {
String result = null;
String[] BookTittle;
Context context;
public  backWorkerNotif(Context context){this.context = context;}

@Override
protected String doInBackground(String... params) {
String selectNotif_url = "http://192.168.254.120/LibrayAPI/SelectNotif.php";
String type = params[0];

if (type.equals("Notif")) {
String DateNow = params[1];
String BorrowerID = params[2];
try {

String data = URLEncoder.encode("date_now", "UTF-8") + "=" +
URLEncoder.encode(DateNow, "UTF-8");
data += "$" + URLEncoder.encode("borrower_id", "UTF-8") + "=" +
URLEncoder.encode(BorrowerID, "UTF-8");

URL url = new URL(selectNotif_url);
URLConnection urlConnection = url.openConnection();
urlConnection.setDoOutput(true);

OutputStreamWriter outputStreamWriter = new OutputStreamWriter(urlConnection.getOutputStream());

outputStreamWriter.write(data);
outputStreamWriter.flush();

BufferedReader bufferedReader = new BufferedReader(new InputStreamReader(urlConnection.getInputStream()));
StringBuilder sb = new StringBuilder();
String line;
while ((line = bufferedReader.readLine()) != null) {

sb.append(line + "\n");
}
result = sb.toString();
} catch (Exception ex) {


}
//Json
try {
JSONArray jsonArray = new JSONArray(result);
JSONObject jsonObject;
BookTittle = new String[jsonArray.length()];
for (int i = 0;i< jsonArray.length();i++){
jsonObject = jsonArray.getJSONObject(i);
BookTittle[i] = jsonObject.getString("BookTittle");

NotificationCompat.Builder  mbuilder = new NotificationCompat.Builder(context)
.setSmallIcon(R.drawable.ic_book_black_24dp)
.setContentTitle("Library notification")
.setContentText("Today is the Due Day of"+ BookTittle[i] +"You Borrowed");
NotificationManager notificationManager =(NotificationManager)context.getSystemService(context.NOTIFICATION_SERVICE);
notificationManager.notify(0,mbuilder.build())
}
} catch (Exception ex) {
ex.printStackTrace();
}
}
return null;
}

@Override
protected void onPreExecute() {
super.onPreExecute();
}

@Override
protected void onPostExecute(String jsonArray) {
super.onPostExecute(jsonArray);
}
}

Войти в класс

public class Login extends AppCompatActivity {

EditText username,password;

@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_login);

username = findViewById(R.id.edtUsername);
password = findViewById(R.id.edtPassword);
}

public void onLogin(View view) {

String Username = username.getText().toString();
String Password = password.getText().toString();
backWorkerNotif backWorkerNotif = new backWorkerNotif(this);
Date date = Calendar.getInstance().getTime();
SimpleDateFormat SF = new SimpleDateFormat("yyyy-MM-dd");
String DateNow = SF.format(date);
backWorkerNotif.execute("Notif", DateNow, Username);

String Type = "login";
GlobalVariable.BorrowerID = Username;
backgroundWorker _backgroundWorker = new backgroundWorker(this);
_backgroundWorker.execute(Type, Username, Password);
}
}

Мой php код

<?php
require "Connection.php";
$DateNow = $_POST["date_now"];
$BorrowerID = $_POST["borrower_id"];

$query = "SELECT A.`BookId`,B.`BookTittle`,A.`BorrowerId` FROM `tblborrow` AS A INNER JOIN `tblbooks` AS B ON A.`BookId` = B.`BookId` WHERE `DueDate` = '$DateNow' AND `BorrowerId` = '$BorrowerID'";
$result = mysqli_query($conn,$query);

while($e = mysqli_fetch_assoc($result)){
$output[] = $e;
}
echo json_encode($output);
print (json_encode($output));
?>

Результат из моего PHP

[
{"BookId":"101","BookTittle":"Counting dolars","BorrowerId":"11"},
{"BookId":"9876","BookTittle":"ihi","BorrowerId":"11"},
{"BookId":"542","BookTittle":"hiragana","BorrowerId":"11"},
{"BookId":"5421","BookTittle":"wow","BorrowerId":"11"}
][
{"BookId":"101","BookTittle":"Counting dolars","BorrowerId":"11"},
{"BookId":"9876","BookTittle":"ihi","BorrowerId":"11"},
{"BookId":"542","BookTittle":"hiragana","BorrowerId":"11"},
{"BookId":"5421","BookTittle":"wow","BorrowerId":"11"}
]

Что я сделал не так?

-1

Решение

как исключение говорит, что вы получили <br значение в ответе не в формате json.

поместите «application / json» в качестве заголовка для вашего типа содержимого запроса. но это не гарантирует, что ваш код будет работать всегда. тем самым вы убедитесь, что получите ответ только в формате json.

проблема в формате выходного потока. если ваше соединение получит какой-либо тип исключения HTTP или ошибки другого типа, вы не узнаете об этом, так как проглотите его. измените это таким образом:

try {

String data = URLEncoder.encode("date_now", "UTF-8") + "=" +
URLEncoder.encode(DateNow, "UTF-8");
data += "$" + URLEncoder.encode("borrower_id", "UTF-8") + "=" +
URLEncoder.encode(BorrowerID, "UTF-8");

URL url = new URL(selectNotif_url);
URLConnection urlConnection = url.openConnection();
urlConnection.setDoOutput(true);

OutputStreamWriter outputStreamWriter = new OutputStreamWriter(urlConnection.getOutputStream());

outputStreamWriter.write(data);
outputStreamWriter.flush();

BufferedReader bufferedReader = new BufferedReader(new InputStreamReader(urlConnection.getInputStream()));
StringBuilder sb = new StringBuilder();
String line;
while ((line = bufferedReader.readLine()) != null) {

sb.append(line + "\n");
}
result = sb.toString();
//JSON
JSONArray jsonArray = new JSONArray(result);
JSONObject jsonObject;
BookTittle = new String[jsonArray.length()];
for (int i = 0;i< jsonArray.length();i++){
jsonObject = jsonArray.getJSONObject(i);
BookTittle[i] = jsonObject.getString("BookTittle");

NotificationCompat.Builder  mbuilder = new NotificationCompat.Builder(context)
.setSmallIcon(R.drawable.ic_book_black_24dp)
.setContentTitle("Library notification")
.setContentText("Today is the Due Day of"+ BookTittle[i] +"You Borrowed");
NotificationManager notificationManager =(NotificationManager)context.getSystemService(context.NOTIFICATION_SERVICE);
notificationManager.notify(0,mbuilder.build());


}


} catch (Exception ex) {
ex.printStackTrace();
}

Пожалуйста, предоставьте нам образец, который вы получите от php. Я имею в виду result значение

0

Другие решения

Других решений пока нет …