Search code examples
javaandroidretrofit

Expected BEGIN_OBJECT but was BEGIN_ARRAY at line 1 column 2 path $ using Retrofit


I am Trying to get a data by a specific id from database using Retrofit but onError calls:

com.google.gson.JsonSyntaxException: java.lang.IllegalStateException: Expected BEGIN_OBJECT but was BEGIN_ARRAY at line 1 column 2 path $

Students class:

public class Students implements Parcelable {
    private int id;
    @SerializedName("first_name")
    private String firstName;
    @SerializedName("last_name")
    private String lastName;
    private String course;

    public int getId() {
        return id;
    }

    public void setId(int id) {
        this.id = id;
    }

    public String getFirstName() {
        return firstName;
    }

    public void setFirstName(String firstName) {
        this.firstName = firstName;
    }

    public String getLastName() {
        return lastName;
    }

    public void setLastName(String lastName) {
        this.lastName = lastName;
    }

    public String getCourse() {
        return course;
    }

    public void setCourse(String course) {
        this.course = course;
    }

    public String getScore() {
        return score;
    }

    public void setScore(String score) {
        this.score = score;
    }

    private String score;

    @Override
    public int describeContents() {
        return 0;
    }

    @Override
    public void writeToParcel(Parcel dest, int flags) {
        dest.writeInt(this.id);
        dest.writeString(this.firstName);
        dest.writeString(this.lastName);
        dest.writeString(this.course);
        dest.writeString(this.score);
    }

    public void readFromParcel(Parcel source) {
        this.id = source.readInt();
        this.firstName = source.readString();
        this.lastName = source.readString();
        this.course = source.readString();
        this.score = source.readString();
    }

    public Students() {
    }

    protected Students(Parcel in) {
        this.id = in.readInt();
        this.firstName = in.readString();
        this.lastName = in.readString();
        this.course = in.readString();
        this.score = in.readString();
    }

    public static final Parcelable.Creator<Students> CREATOR = new Parcelable.Creator<Students>() {
        @Override
        public Students createFromParcel(Parcel source) {
            return new Students(source);
        }

        @Override
        public Students[] newArray(int size) {
            return new Students[size];
        }
    };
}

and here is my retrofit interface code:

public interface Api {
    

    @GET(url)
    Single<Students> getStudent(@Query("id") int id);
}

and my MainActivity:

Retrofit retrofit = new Retrofit.Builder()
                 .baseUrl(URL)
                    .addConverterFactory(GsonConverterFactory.create())
                        .addCallAdapterFactory(RxJava3CallAdapterFactory.create())
                            .build();
        
        Api api = retrofit.create(Api.class);
        
        api.getStudent(339).subscribeOn(Schedulers.io()).observeOn(AndroidSchedulers.mainThread()).subscribe(new SingleObserver<Students>() {
            @Override
            public void onSubscribe(@NonNull Disposable d) {

            }

            @Override
            public void onSuccess(@NonNull Students students) {
                Log.i(TAG, "onSuccess: "+students);
            }

            @Override
            public void onError(@NonNull Throwable e) {
                Log.e(TAG, "onError: "+e );
            }
        });

can you please tell me if I am doing something wrong here?


Solution

  • The issue is that the code is expecting a JSON object (enclosed within curly braces {}) but encountered a JSON array (enclosed within square brackets []) instead.

    The issue is with the way you are parsing the data.