2016-03-14 9 views
21

Sto usando il retrofit: 2.0.0-beta4 per la mia app per Android.Retrofit2.0 ottiene MalformedJsonException mentre il json sembra corretto?

ho cercato di aggiungere un utente con Retrofit, l'utente viene correttamente creato nel database, ma ho ottenuto il seguente errore:

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) 

Il risultato restituito dal server è:

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

Questo è corretto il formato JSON, non capisco perché ottengo tale eccezione?

Qui ci mia interfaccia:

public class ApiResult<T> { 
    public T data; 
    public int status; 
    public String msg; 
} 

public interface ApiUsers { 
    @POST("https://stackoverflow.com/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); 
    } 
} 

Il codice chiamante è:

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

Qualcuno potrebbe dare alcun indizio?

+0

Alcuni caratteri come NUL '\ 0 'potrebbe anche causare questo e noi non riesco a vedere questo personaggio nel debug. Prova a utilizzare la modalità Lenient. – Rohit5k2

+0

Aggiungete anche il codice dove state inizializzando retorofit, ad es. 'Api.getInstance()' e la classe 'User' – vedant1811

+0

Dovreste vedere http://stackoverflow.com/a/11488385/2936153 – Rohit5k2

risposta

57

Infine ho risolto il mio problema che non è correlato alla modalità json clemente, qualcosa di sbagliato con la mia risposta POST (ci sono altri output non json prima dei dati json).

Ecco la risposta da JakeWharton riguardo alle modalità di impostare la modalità GSON indulgente:

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(); 
+0

Non funzionante, come risposta nei dati XML, ho provato tutti i modi possibili – Prasad

+1

Sto ancora ottenendo lo stesso errore dopo aver implementato questa soluzione. Potete darmi qualche suggerimento per risolvere questo errore? Sto usando il retrofit 2 e mi occupo di JSON e non XML – balajiprasadb

+0

sebbene non abbia provato ma possa aiutare qualcuno. Prova [** questo **] (https://stackoverflow.com/a/40013869/2624806). – CoDe

3

ho risolto il 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' 
+0

Qual è la differenza rispetto alla risposta accettata? –

+1

@TotZam Ah ah ah! Qui il codice non è formattato! : D: D – Adhish

+0

Hmm, quindi proverò anche a scrivere il mio codice in una riga - potrebbe essere che risolverà il problema)) –

Problemi correlati