web-dev-qa-db-fra.com

Retrofit2.0 obtient une exception MalformedJson alors que le json semble correct?

J'utilise retrofit: 2.0.0-beta4 pour mon Android app.

J'ai essayé d'ajouter un utilisateur avec Retrofit, l'utilisateur est correctement créé dans la base de données, mais j'ai l'erreur suivante:

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)

Le résultat renvoyé par le serveur est:

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

C'est le format JSON correct, je ne comprends pas pourquoi je reçois une telle exception?

Ici nous mon interface:

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

Le code de l'appelant est:

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

Quelqu'un pourrait-il donner un indice?

28
seaguest

Enfin, j'ai résolu mon problème qui n'est pas lié au mode json lenient, quelque chose qui cloche avec ma réponse POST (il existe une autre sortie non json avant les données json).

Voici la réponse de JakeWharton concernant la définition du mode indulgent 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();
68
seaguest

J'ai résolu le problème

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'
4
Fredy sanchez .m

J'ai résolu mon problème en supprimant du texte HTML supplémentaire et d'autres espaces blancs de mon fichier JSON.

0
santosh devnath