Почему я получаю сообщение об ошибке JsonSyntaxException - PullRequest
0 голосов
/ 24 января 2020

Я новичок в retrofit (раньше я использовал volley), до этого у меня все было в порядке с модернизацией, пока не появилась эта ошибка: -

com.google.gson.JsonSyntaxException : java .lang.IllegalStateException: ожидалось int, но было логическим в строке 8, столбец 37, путь $ .response.data.book_service_id

Я пробовал все решения, представленные на этом сайте, но не мог с собой поделать так как я новичок в retrofit. Я думаю, что это из-за ошибки JSON parsing. Я не знаю, как справиться с этим. Это может быть повторяющийся вопрос, но, пожалуйста, помогите. Ниже мой код:

Запрос и выборка данных:

private void makeBookingRequest(String position) {
    final CustomProgressDialog dialog = new CustomProgressDialog();
    dialog.show(getSupportFragmentManager(),"tag");
    SharedPreferences preferences = getSharedPreferences("MYSharedPref",MODE_PRIVATE);
    String sessionkey = preferences.getString("sessionkey",null);
    System.out.println(sessionkey);
    String serviceId = position;
    System.out.println(position);
    APIEndPoints endPoints = Url.getInstance().create(APIEndPoints.class);
    Call<Book> call = endPoints.makeBookingRequest(serviceId,sessionkey);
    call.enqueue(new Callback<Book>() {
        @Override
        public void onResponse(Call<Book> call, retrofit2.Response<Book> response) {
            dialog.dismiss();
            if (!response.isSuccessful()) {
                Toast.makeText(HomeActivity.this, "server is not responding", Toast.LENGTH_SHORT).show();
            }
            else if(response.body() != null){
                Book bookData = response.body();
                String message = bookData.response.message;
                Toast.makeText(HomeActivity.this, message, Toast.LENGTH_SHORT).show();
            }
        }

        @Override
        public void onFailure(Call<Book> call, Throwable t) {
            dialog.dismiss();
            Toast.makeText(HomeActivity.this, "Error" + t.getLocalizedMessage(), 
Toast.LENGTH_SHORT).show();
            System.out.println(t);
        }
    });
}

Модель класса:

 package com.medpal.medpal_client.Models;
    import com.google.gson.annotations.SerializedName;

    public class Book {
    @SerializedName("response")
    public ResponseEntity response;

    public class ResponseEntity{
        @SerializedName("data")
        public DataEntity data;
        @SerializedName("secondary_message")
        public String secondary_message;
        @SerializedName("message")
        public String message;
        @SerializedName("code")
        public int code;
    }
    public class DataEntity {
        @SerializedName("book_service_id")
        public int book_service_id;
    }
}

APIENDPOINTS

@FormUrlEncoded
@Headers({"apikey: testapikey", "Content-Type:application/x-www-form-urlencoded" })
@POST("service/accept?")
Call<Book> makeBookingRequest(
  @Field("service_id") String ServiceId,
  @Field("session_key") String sessionKey);

Класс URL

 public class Url {
    public static final String base_url = "http://www.medpal.net/api/v1/";
    public static final String serviceUrl = "http://www.medpal.net/api/v1/services?";
        public static Retrofit retrofit;
        public static Retrofit getInstance() {
            if (retrofit == null) {
                retrofit = new Retrofit.Builder()
                        .baseUrl(base_url)
                        .addConverterFactory(GsonConverterFactory.create())
                        .build();
            }
            return retrofit;
        }


}

Окончательный ответ от сервера:

 {
    "response": {
        "error": [],
        "code": 200,
        "message": "Service booked",
        "secondary_message": "Service booked successfully",
        "data": {
            "book_service_id": 35
        }
    }
}

1 Ответ

1 голос
/ 24 января 2020

Чтобы точно определить проблему, вам нужно использовать перехватчик для регистрации ответа сервера, для регистрации ответов сервера вы можете использовать OkHttp3 , вот пример этого.

 private OkHttpClient provideOkhttpClient() {
        OkHttpClient.Builder client = new OkHttpClient.Builder();
        client.readTimeout(15000, TimeUnit.MILLISECONDS);
        client.writeTimeout(70000, TimeUnit.MILLISECONDS);
        HttpLoggingInterceptor interceptor = new HttpLoggingInterceptor();
        interceptor.setLevel(HttpLoggingInterceptor.Level.BODY);
        client.addInterceptor(interceptor);
        return client.build();
    }

И добавьте это в свой Retrofit.Builder

.client(provideOkhttpClient())

И это для Gradle

implementation 'com.squareup.okhttp3:okhttp:3.12.0'
implementation 'com.squareup.okhttp3:logging-interceptor:3.5.0'

Если вы сделаете это, вы увидите все, что вы отправили и получили с сервера на вашем Logcat.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...