Android Studio: тип org.json.JSONArray не может быть преобразован в JSONObject - PullRequest
0 голосов
/ 08 ноября 2019

Я хочу создать просмотр списка. Я ссылаюсь на https://demonuts.com/android-listview-using-volley/.

Я получаю только исходный код для Android, но не php. Когда я создаю свои собственные файлы php, приложения продолжают отображать загрузку и никогда не останавливаются. Когда я вижу журнал cat, он показывает, что «тип org.json.JSONArray не может быть преобразован в JSONObject»

Ниже приведен код

MainActivity.java

   protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);

    listView = findViewById(R.id.lv);

    retrieveJSON();

}

private void retrieveJSON() {

    showSimpleProgressDialog(this, "Loading...","Fetching Json",false);

    StringRequest stringRequest = new StringRequest(Request.Method.GET, URLstring,
            new Response.Listener<String>() {
                @Override
                public void onResponse(String response) {

                    Log.d("strrrrr", ">>" + response);

                    try {

                        JSONObject obj = new JSONObject(response);
                        if(obj.optString("status").equals("true")){

                           dataModelArrayList = new ArrayList<>();
                            JSONArray dataArray  = obj.getJSONArray("data");

                            for (int i = 0; i < dataArray.length(); i++) {

                                DataModel playerModel = new DataModel();
                                JSONObject dataobj = dataArray.getJSONObject(i);

                                playerModel.setTitle(dataobj.getString("title"));
                                playerModel.setShortdesc(dataobj.getString("shortdesc"));
                                playerModel.setImage(dataobj.getString("image"));

                                dataModelArrayList.add(playerModel);

                            }

                            setupListview();

                        }

                    } catch (JSONException e) {
                        e.printStackTrace();
                    }
                }
            },
            new Response.ErrorListener() {
                @Override
                public void onErrorResponse(VolleyError error) {
                    //displaying the error in toast if occurrs
                    Toast.makeText(getApplicationContext(), error.getMessage(), Toast.LENGTH_SHORT).show();
                }
            });

    // request queue
    RequestQueue requestQueue = Volley.newRequestQueue(this);

    requestQueue.add(stringRequest);


}

private void setupListview(){
    removeSimpleProgressDialog();  //will remove progress dialog
    listAdapter = new ListAdapter(this, dataModelArrayList);
    listView.setAdapter(listAdapter);
}

public static void removeSimpleProgressDialog() {
    try {
        if (mProgressDialog != null) {
            if (mProgressDialog.isShowing()) {
                mProgressDialog.dismiss();
                mProgressDialog = null;
            }
        }
    } catch (IllegalArgumentException ie) {
        ie.printStackTrace();

    } catch (RuntimeException re) {
        re.printStackTrace();
    } catch (Exception e) {
        e.printStackTrace();
    }

}

public static void showSimpleProgressDialog(Context context, String title,
                                            String msg, boolean isCancelable) {
    try {
        if (mProgressDialog == null) {
            mProgressDialog = ProgressDialog.show(context, title, msg);
            mProgressDialog.setCancelable(isCancelable);
        }

        if (!mProgressDialog.isShowing()) {
            mProgressDialog.show();
        }

    } catch (IllegalArgumentException ie) {
        ie.printStackTrace();
    } catch (RuntimeException re) {
        re.printStackTrace();
    } catch (Exception e) {
        e.printStackTrace();
    }
}

recyclerview.php

<?php 

//database constants
define('DB_HOST', 'localhost');
define('DB_USER', 'root');
define('DB_PASS', '');
define('DB_NAME', 'recyclerview');

//connecting to database and getting the connection object
$conn = new mysqli(DB_HOST, DB_USER, DB_PASS, DB_NAME);

//Checking if any error occured while connecting
if (mysqli_connect_errno()) {
    echo "Failed to connect to MySQL: " . mysqli_connect_error();
    die();
}

//creating a query
$stmt = $conn->prepare("SELECT id, title, shortdesc, image FROM products;");

//executing the query 
$stmt->execute();

//binding results to the query 
$stmt->bind_result($id, $title, $shortdesc, $image);

$products = array(); 

//traversing through all the result 
while($stmt->fetch()){
    $temp = array();
    $temp['id'] = $id; 
    $temp['title'] = $title; 
    $temp['shortdesc'] = $shortdesc; 
    $temp['image'] = $image; 
    array_push($products, $temp);
}

//displaying the result in json format 
echo json_encode($products);

?>

1 Ответ

1 голос
/ 08 ноября 2019

Текущая версия вашего серверного скрипта создает ответ JSON в следующем формате.

[
   {
      "id": 123,
      "title": "some title",
      "shortdesc": "description here",
      "image": "image here"
   },
   {
      "id": 124,
      "title": "some other title",
      "shortdesc": "description here",
      "image": "image here"
   }
]

Это JSONArray , а не JSONObject. Принимая во внимание, что в коде вашего приложения для Android вы ожидаете ответа JSON, как показано ниже:

{
    "status": "true",
    "data": [
        {
            "id": 123,
            "title": "some title",
            "shortdesc": "description here",
            "image": "image here"
        },
        {
            "id": 124,
            "title": "some other title",
            "shortdesc": "description here",
            "image": "image here"
        }
    ]
}

В коде PHP просто выполните следующие корректировки:

<?php 

// other code here ...

//traversing through all the result 
while($stmt->fetch()){
    $temp = array();
    $temp['id'] = $id; 
    $temp['title'] = $title; 
    $temp['shortdesc'] = $shortdesc; 
    $temp['image'] = $image; 
    array_push($products, $temp);
}


// create an array and add required key-values

$response = array();
$response["status"] = "true";
$response["data"] = $products;

//displaying the result in json format 
// pass $response array to json_encode() method

echo json_encode($response);

?>
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...