Cómo obtener malformado JSON en Retrofit 2

Estoy enviando una solicitud, pero estoy recibiendo una excepción, aunque la solicitud sea correcta (la API con la que estoy interactuando, envía una OTP con éxito).

La excepción es:

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) 

Ahora, ¿cómo vería que JSON malformado? Con el fin de saber si el objeto Json es malformado, si es el objeto que se devuelve (que espero ser una cadena), o es el objeto que estoy enviando.

Perdóname si esta es una pregunta trivial, sólo empecé con el desarrollo de Android, a partir de esta semana.

Aquí está el servicio:

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

Interfaz:

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

Y aquí está la llamada:

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

Simplemente registre las respuestas de su red, para que vea lo que está mal.

 @Override public Response intercept(Chain chain) throws IOException { Response response = chain.proceed(chain.request()); Log.w("Retrofit@Response", response.body().string()); return response; } 

Utilice el convertidor de cadenas para reinstalar el restadapter

  RestAdapter adapterRfqPost = new RestAdapter.Builder() .setEndpoint(Constants.ENDPOINT) .setConverter(new ConstantsMethods.StringConverter()) .build(); 

Clase convertidor de cadenas

 public static class StringConverter implements Converter { @Override public Object fromBody(TypedInput typedInput, Type type) throws ConversionException { String text = null; try { text = fromStream(typedInput.in()); } catch (IOException ignored) {/*NOP*/ } return text; } @Override public TypedOutput toBody(Object o) { return null; } public static String fromStream(InputStream in) throws IOException { BufferedReader reader = new BufferedReader(new InputStreamReader(in)); StringBuilder out = new StringBuilder(); String newLine = System.getProperty("line.separator"); String line; while ((line = reader.readLine()) != null) { out.append(line); out.append(newLine);`enter code here` }`enter code here` return out.toString(); } } 
  • Cómo poner en cola las llamadas de la API cuando no está conectado mientras usa Retrofit
  • Retrofit 2.0 lanzando "IllegalArgumentException: los parámetros @Field solo se pueden usar con la codificación de formularios". ¿Cómo hacer la consulta correcta de la API y arreglarlo?
  • Retrofit, devolución de llamada para 204 No respuesta de contenido?
  • Retrofit 2.0 + RxJava + Error JSON cuerpo
  • ¿Cómo configurar el nivel de registro de depuración y liberación para Retrofit?
  • Cómo probar la interfaz de usuario de Android utilizando IdlingResource cuando se utilizan las solicitudes de red de Retrofit
  • POST Multipart Form Datos usando Retrofit 2.0 incluyendo imagen
  • Cómo emitir elementos de una lista con retraso en RxJava?
  • Deshabilitar la comprobación de certificados SSL en la biblioteca de actualización
  • Configuración de Android studio 1.1.0 minifyEnabled true causando problemas con la aplicación
  • El tipo de retorno observable debe parametrizarse como Observable <Foo> o Observable <? Se extiende Foo>
  • FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.