我正在为我的android应用程序使用retrofit:2.0.0-beta4。
我尝试使用Retrofit添加用户,该用户已在Database中正确创建,但是出现以下错误:
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)
服务器返回的结果是:
{"data":{"user_id":"48","nickname":null,"password":null,"status":null},"status":1,"msg":"OK"}
这是正确的json格式,我不明白为什么会收到这样的异常?
这是我们的界面:
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); } }
呼叫者代码为:
ApiUsers api = Api.getInstance().createService(ApiUsers.class); Call<ApiResult<User>> call = api.createUser(user); CreateUserMessage message = new CreateUserMessage(); callNet(call, message);
有人可以提供任何线索吗?
最后,我解决了与json宽松模式无关的问题,我的POST响应出了点问题(在json数据之前还有其他一些非json输出)。
这是JakeWharton关于如何设置Gson宽容模式的回复:
确保您具有:compile 'com.google.code.gson:gson:2.6.1'
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();