Solution of the java.lang.IllegalState Exception: Expected BEGIN_ARRAY but was BEGIN_OBJECT at line 1 column 2 path $

Merhaba arkadaşlar , retrofit’ te baş belası haline gelen  “java.lang.IllegalState Exception: Expected BEGIN_ARRAY but was BEGIN_OBJECT at line 1 column 2 path $”  hatanın çözümünü paylaşacağım, 2019 yılında almıştım bu hatayı github’da bir issue açmıştım https://github.com/google/gson/issues/1462      bu hatayla ilgili bu nedenle  birçok mail alıyorum “nasıl çözerim” şeklinde bende bir yazı paylaşmanın zamanı geldiğini düşündüm.

Hatayı ilk aldığımda 2 gün çözmeye çalışmıştım, kendim hatanın nedenini farkedemeyince hatanın nedenini sormadığım forum kalmamıştı 🙂 .

Github’da google/json ‘da bir issue açtım çok geç olmadan hepimizin genelde bildiği Jake abimizden yorum geldi ;

Your JSON does not match the model you asked Gson to bind. This is fairly common and is a usage question which has been written about a lot on blogs, mailing lists, and StackOverflow. I would suggest you consult StackOverflow questions of similar nature.

Bu şekilde bir cevap almıştım ve “Your JSON does not match the model you asked Gson to bind.”  bu cümle çözümün ta kendisiydi.

Hemen request  attığım sayfadan gelen response json yapısına baktım ve android proje tarafında oluşturduğum modele baktım nasıl olması gerektiği hakkında bir fikrim yoktu . Hemen farklı Json yapılarını yapılarını araştırıp bunların nasıl modellendiğine baktım . sonrasında kendi Json yapıma uygun modeli oluşturdum. Bu sırada daha önceden öğrendiğim ama bir kez kullandığımdan olsa gerek unuttuğum  http://www.jsonschema2pojo.org/ bu sayfaya, response olarak gelen json çıktınızı verin . Bu sayfa size json yapınıza uygun,  java’da ‘ Pojo class ‘ olarak adlandırdığımız model class larınızı oluşturacaktır. Bu da sizin daha sağlıklı bir şekilde ilerlemenizi sağlayacaktır.

Şimdi sıra geldi bu model ile verileri nasıl işleyeceğinize …

Retrofit kütüphanesini kullandığınız sınıfta Call fonksiyonunuzda kulanacağınız ArrayList’e parametre olarak json modelinizin en tepesindeki root kökteki isimde oluşturulan model sınıfınızı parametre olarak verin .

Vee takın gözlükleri, Problem is solved !  😀

Konuyla ilgili sorunuz olursa yorum kısmına yazabilirsiniz..

 

“Solution of the java.lang.IllegalState Exception: Expected BEGIN_ARRAY but was BEGIN_OBJECT at line 1 column 2 path $” üzerine 5 yorum

  1. Hi,
    I checked the solution which you to mentioned, but i am not able to solve my issue. I am getting this issue on only Android 10. In android 9 or below it is working fine.
    Can you please suggest.

  2. Bende aynı sorunla karşılaştım google da search yaparken sizin githubtaki açtığınız issue ‘yu gördüm. Sizin gibi bende JSON çıktısını doğru bir şekilde Java sınıflarına maplemediğimden aldım bu hatayı.

    jsonschema2pojo.org sitesi doğru bir şekilde sınıflarımı ve alanlarımı oluşturmama yardımcı oldu.

    Paylaşım için teşekkürler.

  3. Bende aynı sorunla cebelleştiğim 2. günümü yaşıyorum siteyi kullanarak json çıktısını java sınıflarına dönüştürdüm düzeleceğini düşünmüştüm ama hala aynı hatayı almaya devam ediyorum.
    Önerebileceğiniz bir şey var mı?

    Paylaşım için teşekkürler

    1. merhaba, sorununuz halen devam ediyorsa örnek json’ı ve call fonksiyonunuzu paylaşabilir misiniz ?

  4. This is my code
    below mentioned error is to store the position of the menu item after dragged..
    public void saveArraylist() {

    SharedPreferences sharedPrefs = getActivity().getSharedPreferences(“user_data”,MODE_PRIVATE);
    SharedPreferences.Editor editor = sharedPrefs.edit();
    Gson gson = new Gson();
    String json = gson.toJson(modelArrayList.toString());
    editor.putString(“data”, json);
    editor.commit();
    editor.apply();
    Log.e(“stringsave”,””+modelArrayList+””+sharedPrefs);
    Log.e(“Saved ModelList :”, ” readArraylist: ” + json);
    }

    below code is to get the saved position from above method after destroying app…

    // getting and displaying last saved position in recycler view
    public void getNewArrayList() {
    SharedPreferences sharedPrefs = getActivity().getSharedPreferences(“user_data”,MODE_PRIVATE);
    Gson gson = new Gson(); // making gson object
    String json = sharedPrefs.getString(“data”, null); // getting saved value from shared preference
    Type type = new TypeToken<ArrayList>() {}.getType();
    modelArrayList = gson.fromJson(json,type);
    /* if (modelArrayList == null) {
    modelArrayList = new ArrayList();
    }*/
    Log.e(“Get Saved List : “, “getArraylist: ” + json);
    }

Bir Cevap Yazın

E-posta hesabınız yayımlanmayacak. Gerekli alanlar * ile işaretlenmişlerdir