반응형
Retrofit 2.0은 Json이 올바른 것처럼 보이는 동안 MalformedJsonException을 얻습니까?
안드로이드 앱으로 retrofit: 2.0.0-beta4를 사용하고 있습니다.
Retrofit을 사용하여 사용자를 추가하려고 했는데 사용자가 데이터베이스에서 올바르게 생성되었습니다. 그러나 다음 오류가 발생했습니다.
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);
누가 단서라도 줄 수 있나요?
마지막으로 post 응답에 문제가 있는 json response와 관련이 없는 문제를 해결했습니다(json 데이터 앞에 json 이외의 출력이 있습니다).
다음은 Gson lenuanty 모드를 설정하는 방법에 대한 JakeWharton의 답변입니다.
다음 사항을 확인합니다.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();
나는 문제를 해결했다
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'
JSON 파일에서 추가 HTML 텍스트 및 기타 공백을 제거하여 문제를 해결했습니다.
언급URL : https://stackoverflow.com/questions/35984898/retrofit2-0-gets-malformedjsonexception-while-the-json-seems-correct
반응형
'programing' 카테고리의 다른 글
Angular 템플릿에서 개체를 디버깅하는 방법(html 파일) (0) | 2023.03.02 |
---|---|
스프링 부트 1.2.3의 경우 JSON 시리얼라이제이션에서 ignore null 값을 설정하려면 어떻게 해야 합니까? (0) | 2023.03.02 |
반응 입력 요소: 값과 기본값 (0) | 2023.03.02 |
알려진 필드와 알 수 없는 필드로 json 직렬화 해제 (0) | 2023.03.02 |
Oracle: 테이블이 존재하는 경우 (0) | 2023.03.02 |