Android Studio:类型org.json.JSONArray无法转换为JSONObject

我想创建列表视图。我来自https://demonuts.com/android-listview-using-volley/

我只获取android的源代码,而不获取php。当我创建自己的php文件时,应用程序会继续显示加载,并且永不停止。当我看到日志猫时,它表明“类型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,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);

?>
yangyang103 回答:Android Studio:类型org.json.JSONArray无法转换为JSONObject

当前版本的服务器脚本会以以下格式生成JSON响应。

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

JSONArray 不是JSONObject。而在您的Android应用程序代码中,您期望得到如下所示的JSON响应,

{
    "status": "true","data": [
        {
            "id": 123,"image": "image here"
        },{
            "id": 124,"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);

?>
本文链接:https://www.f2er.com/3140629.html

大家都在问