Retrofit2.0 obtiene MalformedJsonException mientras el json parece correcto?

Estoy usando retrofit: 2.0.0-beta4 para mi aplicación android.

He intentado agregar un usuario con Retrofit, el usuario está correctamente creado en la base de datos, sin embargo tengo el siguiente error:

03-14 06:04:27.731 30572-30600/com.lehuo.lehuoandroid D/OkHttp: CALLING POST SP_User_CreateUser....your new user_id:48 {"data":{"user_id":"48","nickname":null,"password":null,"status":null},"status":1,"msg":"OK"} 03-14 06:04:27.731 30572-30600/com.lehuo.lehuoandroid D/OkHttp: <-- END HTTP (147-byte body) 03-14 06:04:27.732 30572-30600/com.lehuo.lehuoandroid E/My Jobs: error while executing job com.google.gson.stream.MalformedJsonException: Use JsonReader.setLenient(true) to accept malformed JSON at line 1 column 1 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:587) at com.google.gson.stream.JsonReader.peek(JsonReader.java:429) at com.google.gson.internal.bind.ReflectiveTypeAdapterFactory$Adapter.read(ReflectiveTypeAdapterFactory.java:202) at com.google.gson.TypeAdapter.fromJson(TypeAdapter.java:260) at retrofit2.converter.gson.GsonResponseBodyConverter.convert(GsonResponseBodyConverter.java:32) at retrofit2.converter.gson.GsonResponseBodyConverter.convert(GsonResponseBodyConverter.java:23) at retrofit2.OkHttpCall.parseResponse(OkHttpCall.java:213) at retrofit2.OkHttpCall.execute(OkHttpCall.java:177) at retrofit2.ExecutorCallAdapterFactory$ExecutorCallbackCall.execute(ExecutorCallAdapterFactory.java:87) at com.lehuo.lehuoandroid.async.NetworkJob.callNet(NetworkJob.java:30) at com.lehuo.lehuoandroid.async.CreateUserJob.onRun(CreateUserJob.java:34) at com.path.android.jobqueue.BaseJob.safeRun(BaseJob.java:108) at com.path.android.jobqueue.JobHolder.safeRun(JobHolder.java:60) at com.path.android.jobqueue.executor.JobConsumerExecutor$JobConsumer.run(JobConsumerExecutor.java:201) at java.lang.Thread.run(Thread.java:818) 

El resultado devuelto del servidor es:

 {"data":{"user_id":"48","nickname":null,"password":null,"status":null},"status":1,"msg":"OK"} 

Este es el formato json correcto, no entiendo por qué recibo tal excepción?

Aquí está mi interfaz:

 public class ApiResult<T> { public T data; public int status; public String msg; } public interface ApiUsers { @POST("/users/new") public Call<ApiResult<User>> createUser(@Body User user); } public class User { public int user_id; public String registration; public int registration_type; public String avatar; public String nickname; public String password; public String status; } public class Api { // TODO modify the value public static final String BASE_URL = "xxx"; private static Api instance = new Api(); public static Api getInstance() { return instance; } private Api(){} public Retrofit getRetrofit() { HttpLoggingInterceptor interceptor = new HttpLoggingInterceptor(); interceptor.setLevel(HttpLoggingInterceptor.Level.BODY); OkHttpClient client = new OkHttpClient.Builder() .addInterceptor(interceptor) .retryOnConnectionFailure(true) .connectTimeout(15, TimeUnit.SECONDS) .build(); Retrofit retrofit = new Retrofit.Builder() .baseUrl(BASE_URL) .client(client) .addConverterFactory(GsonConverterFactory.create()) .build(); return retrofit; } public <S> S createService(Class<S> serviceClass) { return getRetrofit().create(serviceClass); } } 

El código de la persona que llama es:

 ApiUsers api = Api.getInstance().createService(ApiUsers.class); Call<ApiResult<User>> call = api.createUser(user); CreateUserMessage message = new CreateUserMessage(); callNet(call, message); 

¿Podría alguien dar alguna pista?

Finalmente resolví mi problema que no está relacionado con el modo json lenient, algo mal con mi respuesta POST (hay alguna otra salida no json antes de los datos json).

Aquí está la respuesta de JakeWharton respecto a cómo configurar el modo indulgente de Gson:

 make sure that you have:   compile 'com.google.code.gson:gson:2.6.1' Gson gson = new GsonBuilder() .setLenient() .create(); Retrofit retrofit = new Retrofit.Builder() .baseUrl(BASE_URL) .client(client) .addConverterFactory(GsonConverterFactory.create(gson)) .build(); 

Resolví el problema

  Gson gson = new GsonBuilder().setLenient().create(); OkHttpClient client = new OkHttpClient(); Retrofit retrofit = new Retrofit.Builder().baseUrl("http://kafe.netai.net/").client(client).addConverterFactory(GsonConverterFactory.create(gson)).build(); compile 'com.squareup.retrofit2:retrofit:2.1.0' compile 'com.squareup.retrofit2:converter-gson:2.1.0' compile 'com.google.code.gson:gson:2.7' 
  • Utilizar RxJava para encadenar la solicitud en un solo hilo
  • Runtime Execption java.lang.NoClassDefFoundError: retrofit2.Platform en Android
  • ¿Gradle falló con Facebook SDK, Fresco lib y Retrofit?
  • If-None-Match no se pasa en mi solicitud
  • No se puede convertir el objeto Subclase en cuerpo de solicitud json en Retrofit 2.0 con GsonConverterFactory
  • Retrofit, Generic Tipo de llamada
  • No se puede analizar el error en Retrofit 2
  • Retrofit2 y kotlin
  • InterruptedIOException al usar Retrofit2 con rx cuando retryOn
  • Repetir la llamada API con retrofit y rxjava
  • RxAndroid y Retrofit: No se puede crear el adaptador de llamada para io.reactivex.Observable <retrofit2.Response <okhttp3.ResponseBody >>
  • FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.