There are answers to this questions maybe but none of them helped me still getting the same error .
Actually trying to get dynamically generated report in android from server using retrofit .
But I am getting error while returning response . ERROR : onFailure:: Failed java.lang.IllegalStateException: Expected BEGIN_OBJECT but was STRING at line 1 column 1 path $
Please , I need help .
My Jason
{
"LoanDetails": [
{
"SrNo": "1",
"LoanId": "BN582517",
"StaffName": "Some Name",
"Gender": "Male",
"DisbursementDate": "2019-09-11",
"RecoveryDate": "2019-10-11",
"NameOfBorrower": "Muhammad Hassan Magsi",
"GuardianName": "Allah Dino",
"NICNumber": "Some CNIC",
"RegionName": "Some Name",
"LoanAmountPrincipal": "100000",
"InterestRate": "22",
"LoanTerm": "12",
"TotalLoanAmount": "123000.0000",
"TotalRecoveredAmount": "0",
"Balance": "Balance",
"LastPaymentDate": "--",
"DueInstallment": "0",
"OverDues": "0",
"TotalDues": "0",
"PrePayment": "0",
"ReceiptNo": "3124",
"AmountRecovered": "",
"RemainingDues": "",
"Date": "2019-09-11"
}
]
}
My Interface .
public interface ApiInterface {
@GET("employees/tabData/tablet_reports.php")
Call < ServerResponseParser > getReport();
}
Retrofit Client .
public class ApiClient {
public static final String BASE_URL = "http://mmsold.safcosupport.org/";
public static Retrofit retrofit = null;
public static final OkHttpClient okHttpClient = new OkHttpClient.Builder()
.readTimeout(5, TimeUnit.MINUTES)
.connectTimeout(5, TimeUnit.MINUTES)
.build();
public static Retrofit getClient() {
if (retrofit == null) {
Gson gson = new GsonBuilder ()
.setLenient()
.create();
retrofit = new Retrofit.Builder()
.baseUrl(BASE_URL)
.client(okHttpClient)
.addConverterFactory( GsonConverterFactory.create(gson))
.build();
}
return retrofit;
}
}
POJO Class .
public class LoanDetail {
@SerializedName("SrNo")
@Expose
private String srNo;
@SerializedName("LoanId")
@Expose
private String loanId;
}
Just sample provide complete class if needed .
ServerResponseParser Class
public class ServerResponseParser implements Serializable {
@SerializedName("LoanDetails")
@Expose
private ArrayList <LoanDetail> loanDetails = new ArrayList <LoanDetail>( );
public ArrayList < LoanDetail > getLoanDetails () {
return loanDetails;
}
public void setLoanDetails ( ArrayList < LoanDetail > loanDetails ) {
this.loanDetails = loanDetails;
}
}
Code in MainActivity
public void getReport(){
progressDialog = new ProgressDialog (MainActivity.this);
progressDialog.setMessage("Fetching Data...");
progressDialog.setCancelable(false);
progressDialog.show();
ApiInterface apiService =
ApiClient.getClient().create(ApiInterface.class);
Call<ServerResponseParser> call = apiService.getReport ();
call.enqueue ( new Callback < ServerResponseParser > () {
@Override
public void onResponse ( Call < ServerResponseParser > call , Response < ServerResponseParser > response ) {
if (response.isSuccessful ()){
ArrayList<LoanDetail> statioList = response.body().getLoanDetails ();
Log.e ( "onResponse: " , statioList.toString () + "" );
}else {
Log.e ( "onResponse: " , "Empty Response" + response.body ().toString () );
}
progressDialog.dismiss ();
}
@Override
public void onFailure ( Call < ServerResponseParser > call , Throwable t ) {
Log.e ( "onFailure: " , "Failed " + t.getMessage () );
progressDialog.dismiss ();
}
} );
}