Soru & Cevap

org.json.JSONObject cannot be converted to JSONArray hatası

20.04.2015 - 02:55

Herkese merhaba
Android uygulamamda Mysqlden veri çekip kullanmam gerekiyordu.Volley kütüphanesi kullanarak Json parse işlemi yapıyorum fakat org.json.JSONObject cannot be converted to JSONArray hatası alıyorum.

Hatayı kodumdaki: [code]JSONObject person =etkinlikler.getJSONObject(i);[/code] satırında alıyorum.Php çıktımda sorun yok gibi gözüküyor.Veritabanı bağlantımda da sorun yok.Birkaç gündür sırf bunu çözmeye çalışıyorum stackoverdaki cevaplarla çözemedim.Yardım ederseniz çok sevinirim.

Not:Emülator olarak Genymotion kullandığım için ip adresi 10.0.3.2 yani orada bir hata yok

 

Php çıktım:

{
    "etkinlikler": [
        {
            "_id": "1",
            "ad": "toplanti1",
            "tarih": "tarih1",
            "yer": "yer1",
            "baslangicsaati": "13:00",
            "bitissaati": "18:00"
        },
        {
            "_id": "2",
            "ad": "toplanti2",
            "tarih": "tarih2",
            "yer": "yer2",
            "baslangicsaati": "14:00",
            "bitissaati": "17:00"
        }
    ]
}

 

 

Java kodum:

[code]package com.monat.bitirme.anamenu;


public class EtkinlikTakvimiActivity extends Activity {

    ListView lv;

    private String jsonResponse;

    private ProgressDialog pDialog;

    TextView tv;

    // Creating JSON Parser object
    JSONParser jParser = new JSONParser();

    ArrayList<Etkinlik> etkinlikList;

    // url to get all etkinlikler list
    private static String url_tum_etkinlikler = "http://10.0.3.2/Bitirme/get_tum_etkinlikler.php";

    // JSON Node names
    private static final String TAG_SUCCESS = "success";
    private static final String TAG_ETKINLIKLER = "etkinlikler";
    private static final String TAG_ID = "id";
    private static final String TAG_AD = "ad";
    private static final String TAG_YER = "yer";
    private static final String TAG_TARIH = "tarih";
    private static final String TAG_BASLANGIC_SAATI = "baslangicsaati";
    private static final String TAG_BITIS_SAATI = "bitissaati";

    // etkinlikler JSONArray
    JSONArray etkinlikler = null;

    private RequestQueue mRequestQueue;

    String TAG;

    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_etkinlik_takvimi);

        tv=(TextView)findViewById(R.id.textView14);

        etkinlikList = new ArrayList<Etkinlik>();
        lv = (ListView) findViewById(R.id.lvEtkinlikTakvimi);

        pDialog = new ProgressDialog(this);
        pDialog.setMessage("Please wait...");
        pDialog.setCancelable(false);

        makeJsonArrayRequest();

    }

    private void makeJsonArrayRequest() {

        showpDialog();

        JsonArrayRequest req = new JsonArrayRequest(url_tum_etkinlikler,
                new Response.Listener<JSONArray>() {
                    @Override
                    public void onResponse(JSONArray response) {
                        Log.d(TAG_ETKINLIKLER, response.toString());

                        try {
                            // Parsing json array response
                            // loop through each json object
                            etkinlikler=response;
                            jsonResponse = "";

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

                                JSONObject person =etkinlikler.getJSONObject(i);
                                        //getJSONObject(i);

                                String _id = person.getString("_id");
                                String ad = person.getString("ad");
                                String yer = person.getString("yer");
                                String tarih = person.getString("tarih");
                                String baslangicsaati = person.getString("baslangicsaati");
                                String bitissaati = person.getString("bitissaati");


                                jsonResponse += "Name: " + _id + "\n";
                                jsonResponse += "Email: " + ad + "\n";
                                jsonResponse += "Home: " + yer + "\n";
                                jsonResponse += "Mobile: " + tarih + "\n";
                                jsonResponse += "Mobile: " + baslangicsaati + "\n";
                                jsonResponse += "Mobile: " + bitissaati + "\n";

                            }

                            tv.setText(jsonResponse);

                        } catch (JSONException e) {
                            e.printStackTrace();
                            Toast.makeText(getApplicationContext(),
                                    " Volley Error + " + e.getMessage(),
                                    Toast.LENGTH_LONG).show();
                            Log.e("hata",e.getMessage());                        }

                        hidepDialog();
                    }
                }, new Response.ErrorListener() {
            @Override
            public void onErrorResponse(VolleyError error) {
                VolleyLog.d(TAG_ETKINLIKLER, "Error: " + error.getMessage());
                Toast.makeText(getApplicationContext(),
                        "Volley Error + "+error.getMessage(), Toast.LENGTH_SHORT).show();
                 //Log.e("hata",error.getMessage());

                hidepDialog();
            }
        });

        // Adding request to request queue
        AppController.getInstance().addToRequestQueue(req);
    }

    private void showpDialog() {
        if (!pDialog.isShowing())
            pDialog.show();
    }

    private void hidepDialog() {
        if (pDialog.isShowing())
            pDialog.dismiss();
    }

}

[/code]

Php Kodum:

[code]<?php

// array for JSON response
$response = array();

try {
     $db = new PDO("mysql:host=localhost;dbname=bitirme", "root", "");
} catch ( PDOException $e ){
     print $e->getMessage();
}

$result = $db->query("SELECT * FROM etkinlikler", PDO::FETCH_ASSOC);

if ( $result->rowCount() ){
    
        // etkinlikler node
    $response["etkinlikler"] = array();
    
     foreach( $result as $row ){
// looping through all results

        $etkinlik = array();
        $etkinlik["_id"] = $row["_id"];
        $etkinlik["ad"] = $row["ad"];
        $etkinlik["tarih"] = $row["tarih"];
        $etkinlik["yer"] = $row["yer"];
        $etkinlik["baslangicsaati"] = $row["baslangicsaati"];
        $etkinlik["bitissaati"] = $row["bitissaati"];

        // push single etkinlik into final response array
        array_push($response["etkinlikler"], $etkinlik);
     }

     
    // echoing JSON response
    echo json_encode($response);
    

?>

[/code]

 

56 Görüntülenme

2 Cevap

Sitedeki sorulara cevap verebilmek için giriş yapın ya da üye olun.

Profile picture for user tilikoglu
tilikoglu
21.04.2015 - 11:47

Merhaba,

Ahmet'in cevabı gayet doğru. Buna sorudan bağımsız bir ekleme yapmak istiyorum. Eğer elinizde dönen json nesnesine uygun bir class var ise, bu class'a otomatik olarak çeviren kütüphaneler var. Bunlardan birisi de gson

Şu şekilde kullanabilirsiniz.

[code]

Etkinlik e = new Gson().fromJson("{buradajsonstringvar}", Etkinlik.class);

 

public class Etkinlik implements Serializable {

    private String _id;

    private String ad;

    ... //diğer alanlar

    public void setId(String _id) {

        this._id = _id;

    }

    public String getId() {

        return this._id;

    }

    ... //diğer getter-setterlar

}

 

[/code]

Mehmet Onat Güvenir
25.04.2015 - 01:31
teşekkürler.Json ile ilgili işleri hallettikten sonra gson kullanırım artık.
picture-1372-1408467635.jpg
ahmtbrk
20.04.2015 - 07:54

Sebebi şu

İlk olarak sana jsonobject geliyor onun altında ise JsonArray mevcut.

Requestini JSONObject olarak değiştirip içerisinde gelen değerden.

JSONArray etkinlikArray = jsonObject.getJsonArray("etkinlikler") şeklinde alman gerekiyor.

Daha sonra etkinlikArray'i for ile dönebilirsin.

Mehmet Onat Güvenir
25.04.2015 - 01:28
Teşekkürler cevabınız için.Bu json ile ilgili hatalardan sıkıldım.Projenin de bitirme tezi olması ve gecikme riski yüzünden Sqliteye dönüş yaptım.Projeyi tamamen bitirdikten sonra rahat kafayla webservis işine gireceğim.