Sto inviando una richiesta, ma sto ottenendo un'eccezione, anche se la richiesta ha esito positivo (l'API con cui sto interagendo, invia un OTP in caso di successo).Come ottenere JSON non valido in Retrofit 2
L'eccezione è:
com.google.gson.stream.MalformedJsonException: Use JsonReader.setLenient(true) to accept malformed JSON at line 1 column 2 path $
at com.google.gson.stream.JsonReader.syntaxError(JsonReader.java:1573)
at com.google.gson.stream.JsonReader.checkLenient(JsonReader.java:1423)
at com.google.gson.stream.JsonReader.doPeek(JsonReader.java:575)
at com.google.gson.stream.JsonReader.peek(JsonReader.java:429)
at com.google.gson.internal.bind.TypeAdapters$13.read(TypeAdapters.java:349)
at com.google.gson.internal.bind.TypeAdapters$13.read(TypeAdapters.java:346)
at com.google.gson.TypeAdapter.fromJson(TypeAdapter.java:256)
at retrofit.GsonConverter.fromBody(GsonConverter.java:42)
at retrofit.OkHttpCall.parseResponse(OkHttpCall.java:144)
at retrofit.OkHttpCall.access$000(OkHttpCall.java:25)
at retrofit.OkHttpCall$1.onResponse(OkHttpCall.java:90)
at com.squareup.okhttp.Call$AsyncCall.execute(Call.java:168)
at com.squareup.okhttp.internal.NamedRunnable.run(NamedRunnable.java:33)
at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1080)
at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:573)
at java.lang.Thread.run(Thread.java:856)
Ora come vorrei vedere che JSON deforme? Per sapere se l'oggetto JSON è malformato, se è l'oggetto che viene restituito (che mi aspetto essere una stringa), o è l'oggetto che sto inviando.
Perdonami se questa è una domanda banale, ho iniziato solo con lo sviluppo Android, a partire da questa settimana.
Qui è il servizio:
public static EnrollmentApiInterface getApiClient(){
if (EnrollmentRequest == null) {
OkHttpClient client = new OkHttpClient();
client.interceptors().add(new Interceptor() {
@Override
public Response intercept(Chain chain) throws IOException {
Response response = chain.proceed(chain.request());
Request request = chain.request();
Buffer buffer = new Buffer();
request.body().writeTo(buffer);
String body = buffer.readUtf8();
Log.println(10, TAG, body);
Log.i(TAG, "hello: " + response);
String bodyString = response.body().string();
Log.i(TAG, bodyString);
response = response.newBuilder()
.body(ResponseBody.create(response.body().contentType(), bodyString))
.build();
return response;
}
});
Gson gson = new GsonBuilder()
.setDateFormat("yyyy-MM-dd'T'HH:mm:ssZ")
.create();
Retrofit retrofit = new Retrofit.Builder()
// .baseUrl("http://10.0.2.2:6543/") // On AVD
.baseUrl("http://192.168.0.106:6543") // On device
.addConverterFactory(GsonConverterFactory.create(gson))
.build();
EnrollmentRequest = retrofit.create(EnrollmentApiInterface.class);
}
return EnrollmentRequest;
}
Interfaccia:
public interface EnrollmentApiInterface {
@Headers({
"Accept: application/json",
"Content-Type: application/json"
})
@POST("auth/enroll")
Call<String> RequestEnrollment(@Body JsonObject EnrollmentDetails);
@Headers({
"Accept: application/json",
"Content-Type: application/json"
})
@POST("auth/enroll/auth")
Call<String> AuthoriseEnrollment(@Body JsonObject LoginDetails);
}
}
e qui è la chiamata:
EnrollmentRequest request = new EnrollmentRequest();
request.setMsisdn(MsisdnTxt.getText().toString());
request.setId_number(IdNumberTxt.getText().toString());
EnrollmentApiClient.EnrollmentApiInterface service = EnrollmentApiClient.getApiClient();
Log.i(TAG, "REQUEST: " + request.toJson());
Call<String> call = service.RequestEnrollment(request.toJson());
call.enqueue(new Callback<String>() {
@Override
public void onResponse(Response<String> response) {
Log.i(TAG, "ON RESPONSE" + response);
Log.i(TAG, "ON RESPONSE BODY" + response.body());
// Create object of SharedPreferences.
SharedPreferences sharedPref = PreferenceManager.getDefaultSharedPreferences(that);
//now get Editor
SharedPreferences.Editor editor = sharedPref.edit();
//put your value
editor.putString("IDnumber", IdNumberTxt.getText().toString());
editor.putString("Msisdn", MsisdnTxt.getText().toString());
//commits your edits
editor.commit();
Log.i(TAG, "onClick-AFTER");
Intent intent = new Intent(getApplicationContext(), AuthoriseActivity.class);
startActivity(intent);
}
@Override
public void onFailure(Throwable t) {
// It always comes in here
Log.i(TAG, "NOTHERE", t);
Log.d("CallBack", " Throwable is " + t.toString());
Toast.makeText(EnrollActivity.this, "Request Failed", Toast.LENGTH_LONG).show();
}
});
Ciao retrofit beta-2 ha rilasciato che ha parametro retrofit insieme con la risposta che vi aiuterà visualizzare i dati grezzi come risposta. Il tuo problema è la risposta inviata dal server non è in formato valido. È possibile creare il proprio gsonConverter, passare l'adattatore e all'interno è possibile vedere la risposta dal server che lo converte come stringa. – subhash
@subhash Ho aggiunto un convertitore di stringhe, perché mi aspetto che la risposta sia una stringa, ma ottengo lo stesso errore. qualche idea? – Renier