true setlenient jsonreader column accept android json gson retrofit retrofit2

android - use jsonreader setlenient true to accept malformed json at line 1 column 1 path



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

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

Aquí está la respuesta de JakeWharton con 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();

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

Intenté 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 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í tenemos 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);

¿Alguien podría dar alguna pista?


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''


Resolví mi problema eliminando texto HTML adicional y otros espacios en blanco de mi archivo JSON.