Retrofit2.0 obtiene MalformedJsonException mientras que el json parece correcto?

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

Traté de agregar un usuario con Retrofit, el usuario se creó correctamente en la base de datos, sin embargo, recibí 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 por el 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é obtengo esa excepción.

Aquí nosotros mi interfaz:

 public class ApiResult { public T data; public int status; public String msg; } public interface ApiUsers { @POST("/users/new") public Call<ApiResult> 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 createService(Class serviceClass) { return getRetrofit().create(serviceClass); } } 

El código de la persona que llama es:

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

¿Alguien podría dar alguna pista?

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

Aquí está la respuesta de JakeWharton con respecto a cómo configurar el modo indulgente 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'