web-dev-qa-db-de.com

Retrofit2.0 bekommt MalformedJsonException, während der json korrekt zu sein scheint?

Ich verwende Retrofit: 2.0.0-beta4 für meine Android App.

Ich habe versucht, einen Benutzer mit Retrofit hinzuzufügen. Der Benutzer wurde korrekt in der Datenbank erstellt. Es wurde jedoch die folgende Fehlermeldung angezeigt:

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)

Das vom Server zurückgegebene Ergebnis ist:

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

Dies ist das richtige JSON-Format. Ich verstehe nicht, warum ich eine solche Ausnahme erhalte.

Hier uns meine Schnittstelle:

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

Der Anrufercode lautet:

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

Könnte jemand einen Hinweis geben?

28
seaguest

Schließlich habe ich mein Problem behoben, das nicht mit dem JSON-Lenient-Modus zusammenhängt, was mit meiner POST - Antwort (es gibt eine andere Nicht-JSON-Ausgabe vor den JSON-Daten) nicht stimmt.

Hier ist die Antwort von JakeWharton zum Festlegen des Gson-Lenient-Modus:

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

Ich habe das Problem gelöst

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

Ich habe mein Problem gelöst, indem ich zusätzlichen HTML-Text und andere Leerzeichen aus meiner JSON-Datei entfernt habe.

0
santosh devnath