sayres
sayres

Reputation: 381

Retrofit2: Expected BEGIN_ARRAY

I am using for first time of Retrofit2 and I got this error:

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

I know my problem is my pojo class but I can't find the right solution to my problem.I create WCF web service an this service return to me a Arraylist of my user class as a json. this is my jsom response from wcf server by poster:

{
"GetUsersResult": [
    {
        "CreationDateTime": "/Date(1508174478395)/",
        "Id": "8e601956-04ab-4464-9f84-c129141b8198",
        "Topic": "Topics",
        "UserInfo": {
            "Age": "15",
            "Email": "",
            "LastName": "choopani",
            "Name": "niloofar",
            "SimId": "89984320001079005854"
        },
        "UserName": "niloo"
    },...

According my response I have created pojo class :

public class User {

@SerializedName("UserInfo")
private ExpChild mChildrenList;
private String UserName, CreationDateTime,Id,Topic;


public User(String mUserName,String mCreationDateTime,String mId,
                 String mTopic) {
    UserName = mUserName;
    CreationDateTime = mCreationDateTime;
    Id = mId;
    Topic = mTopic;
}

this is Interface for my client post method:

    @POST("json/GetUsers")
Call<List<User>> getAllUsers();

as you can see, I want to be returned a list of my User. after that I create retrofit service creator and into my main Activity I've used it:

        allUsers.enqueue(new Callback<List<User>>() {
        @Override
        public void onResponse(Call<List<User>> call, Response<List<User>> response) {
            List<User> users = response.body();
        }

        @Override
        public void onFailure(Call<List<User>> call, Throwable t) {
            Toast.makeText(MainActivity.this, "faild to connect", Toast.LENGTH_SHORT).show();
            Log.i("====>", "onFailure: "+ t.getMessage());
        }
    });

but I got above error!!where is my mistake?

Upvotes: 0

Views: 128

Answers (1)

Kiskae
Kiskae

Reputation: 25603

Your server returns a JSON object, but your interface says it expects a JSON array. (The List type).

You need to have a second object to represent the full response by the server:

public class ServerResponse {
    @SerializedName("GetUsersResult")
    private List<User> users;

    ... Constructor and getters here
}

Then the Retrofit interface should return Call<ServerResponse> which matches the returned JSON, fixing the error.

Upvotes: 1

Related Questions