Retrofit 2 Error: java.lang.IllegalStateException: expected BEGIN_OBJECT, but was STRING on row 6 of column 1 of the path

Help me with this, please code as follows

Activities

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); 

Class of service

 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 Error java.lang.IllegalStateException: expected BEGIN_OBJECT, but there was STRING on row 6, column 1 path $ Thanks in Advance

-one
android retrofit retrofit2
May 17 '17 at 7:42
source share
2 answers

Like the specified exception, you get an object, but it initializes as String. In POJO, only a string is a message, so it is obvious that the problem is. A message is some kind of object, and there is probably a real line inside it. So just create a message object, and then pull out the string message from the inside. Initialize this object in the parent class:

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

then add a subclass to 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); 
0
May 17 '17 at 8:38
source share
— -

I think the problem is not in your code, but just check your server log what json line for your server will send you a match with the current expected json output

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

secondly, I offer you a custom serializable pojo class, for example

 public class UserList implements Serializable { } public class UserDatum implements Serializable { } 

When sending an object to the server, I need to implement a Serializable or parableable interface

I have something like this GsonConverterFactory.create ()

 Retrofit retrofit = new Retrofit.Builder() .baseUrl(ROOT) .client(defaultHttpClient) .addConverterFactory(GsonConverterFactory.create()) .build(); 
0
May 17 '17 at 10:45 a.m.
source share



All Articles