Retrofit 2 Error:java.lang.IllegalStateException: Expected BEGIN_OBJECT but was STRING at line 6 column 1 path

ぃ、小莉子 提交于 2019-12-08 13:55:54

问题


Help Me for this issue, please code is as follow

Activity

protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        TaskData taskData= new TaskData();
        taskData.setEmail("praik@gmail.com");
        Task task= new Task();
        task.setTaskData(taskData);
        Log.v("@@@WWE"," Call Initiated");
        task.setTask("getUserDetail");


        JSONObject taskDatas= new JSONObject();

        JSONObject taskM= new JSONObject();
        try {
            taskDatas.put("email","praik@gmail.com");
            taskM.put("task","getUserDetail");
            taskM.put("taskData",taskDatas);
        } catch (JSONException e) {
            e.printStackTrace();
        }

        Map<String,JSONObject> taskMap= new HashMap<>();
        taskMap.put("reqObject",taskM);
        getUserDetails(taskMap);
        Log.v("@@@WWE"," Call Over");
    }

  public void getUserDetails(Map<String,JSONObject> task){
        ServiceInterfaceApi interfaceApi= ServiceClass.getApiService();
        Call<UserList>call=interfaceApi.getUserDetails(task);
        Log.v("@@@WWE","Retrofit Request Method =  "+call.request().method());
        Log.v("@@@WWE","Retrofit Request Body =  "+call.request().body());
        Log.v("@@@WWE","Retrofit Request Url = "+call.request().url());
        Log.v("@@@WWE","Retrofit Request executed = "+call.isExecuted());
        call.enqueue(new Callback<UserList>() {
            @Override
            public void onResponse(Call<UserList> call, Response<UserList> response) {
                Log.v("@@@","Response");
                if (response.isSuccessful()){
                    Log.v("@@@","Sucess");
                    userList=response.body().getUserData();
                    for (int i = 0; i < userList.size(); i++) {
                        UserDatum userDatum=userList.get(i);
                        Log.v("@@@@WWE"," USer Email "+userDatum.getEmail());
                        Log.v("@@@@WWE"," USer Name "+userDatum.getName());
                        Log.v("@@@@WWE"," USer Gender "+userDatum.getGender());
                    }
                }
                if(response.code()==400){
                    Toast.makeText(Home.this,"400 code ",Toast.LENGTH_LONG).show();
                }
            }
            @Override
            public void onFailure(Call<UserList> call, Throwable t) {
                Log.v("@@@WWE","Failure "+t.getMessage());
            }
        });
    }

Service Interface

@Headers("Content-Type: application/json")
@POST("index.php")
    Call<UserList>getUserDetails(@QueryMap Map<String,JSONObject> stringTaskMap);

Service Class

public class ServiceClass {
    public ServiceClass() {
    }

    private static Retrofit getRetroClient(){
        Gson gson = new GsonBuilder()
                .setLenient()
                .create();
        return new Retrofit.Builder()
                .baseUrl(HttpConstants.baseUrl)
                .addConverterFactory(GsonConverterFactory.create(gson))
                .build();
    }

    public static ServiceInterfaceApi getApiService(){
        return getRetroClient().create(ServiceInterfaceApi.class);
    }
}

Pojo Class:

public class UserList {

    @SerializedName("userData")
    @Expose
    private List<UserDatum> userData = null;
    @SerializedName("code")
    @Expose
    private Integer code;
    @SerializedName("message")
    @Expose
    private String message;

    public List<UserDatum> getUserData() {
        return userData;
    }

    public void setUserData(List<UserDatum> userData) {
        this.userData = userData;
    }

    public Integer getCode() {
        return code;
    }

    public void setCode(Integer code) {
        this.code = code;
    }

    public String getMessage() {
        return message;
    }

    public void setMessage(String message) {
        this.message = message;
    }

}

public class UserDatum {

    @SerializedName("email")
    @Expose
    private String email;
    @SerializedName("password")
    @Expose
    private String password;
    @SerializedName("name")
    @Expose
    private String name;
    @SerializedName("image")
    @Expose
    private String image;
    @SerializedName("mobile")
    @Expose
    private String mobile;
    @SerializedName("birth_date")
    @Expose
    private String birthDate;
    @SerializedName("dateofregister")
    @Expose
    private String dateofregister;
    @SerializedName("gender")
    @Expose
    private String gender;

    public String getEmail() {
        return email;
    }

    public void setEmail(String email) {
        this.email = email;
    }

    public String getPassword() {
        return password;
    }

    public void setPassword(String password) {
        this.password = password;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public String getImage() {
        return image;
    }

    public void setImage(String image) {
        this.image = image;
    }

    public String getMobile() {
        return mobile;
    }

    public void setMobile(String mobile) {
        this.mobile = mobile;
    }

    public String getBirthDate() {
        return birthDate;
    }

    public void setBirthDate(String birthDate) {
        this.birthDate = birthDate;
    }

    public String getDateofregister() {
        return dateofregister;
    }

    public void setDateofregister(String dateofregister) {
        this.dateofregister = dateofregister;
    }

    public String getGender() {
        return gender;
    }

    public void setGender(String gender) {
        this.gender = gender;
    }

}

Expected Response

{"userData":[{"email":"foo@mail.com","password":"12345","name":"foo bar","image":"foo","mobile":"123","birth_date":"12345646","dateofregister":"1493706304000","gender":"male"}],"code":200,"message":"DONE"}

here is my error message Failure java.lang.IllegalStateException: Expected BEGIN_OBJECT but was STRING at line 6 column 1 path $ Thanks in Advance


回答1:


Like exception said, you are getting object but it is initialized as String. In POJO only string is message so obviously that's the problem. Message is some kind of object and real string is probably inside of it. So just create message object and then pull your string message from the inside. First initialize that object in parent class:

@SerializedName("message")
@Expose
private Message message;

then add the subclass in POJO

class Message{

   @SerializedName("message")
   @Expose
   private String message;

    public String getMessage() {
      return message;
    }

    public void setMessage(String message) {
      this.message = message;
    }

}

EDIT: HEADER

@Headers("Content-Type: application/json")
@POST("index.php")
Call<UserList>getUserDetails(@QueryMap Map<String,JSONObject> stringTaskMap);



回答2:


I think problem is not in your code just check your server log, what json string your server send to you match with your current expected output json

To check server output you can use postman or restclient - just pass your url ,method ,and parameter

secondly ill suggest you to user serializable pojo class like

public class UserList implements Serializable {

}
public class UserDatum implements Serializable {

}

Object send to server must me impliment Serializable or parcelable interface

I have use something like this GsonConverterFactory.create()

Retrofit retrofit = new Retrofit.Builder()
                .baseUrl(ROOT)
                .client(defaultHttpClient)
                .addConverterFactory(GsonConverterFactory.create())
                .build();


来源:https://stackoverflow.com/questions/44018534/retrofit-2-errorjava-lang-illegalstateexception-expected-begin-object-but-was

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!