java.lang.IllegalStateException: ожидалось BEGIN_OBJECT, но было STRING в строке 1, столбце 1, пути $

Я перепроверил много ссылок, прежде чем задавать вопрос. Как и большинство людей, я звоню в веб-сервис и получаю вышеуказанный результат. Моя проблема более конкретна, поэтому прежде чем спрашивать, позвольте мне добавить code snippet

public static WebService getRestService(String newApiBaseUrl, String accessToken)
    {
        OkHttpClient.Builder httpClient = new OkHttpClient.Builder();


        if (BuildConfig.DEBUG) {
            HttpLoggingInterceptor logging = new HttpLoggingInterceptor();
            logging.setLevel(HttpLoggingInterceptor.Level.BODY);
            httpClient.addInterceptor(logging);
        }


        Gson gson = new GsonBuilder()
                .setLenient()
                .create();

        restBuilder = new Retrofit.Builder()
                .baseUrl(newApiBaseUrl)
                .client(httpClient.build())
                .addConverterFactory(GsonConverterFactory.create(gson));

        if (accessToken != null) {
            AuthenticationInterceptor interceptor =
                    new AuthenticationInterceptor(accessToken);

            if (!httpClient.interceptors().contains(interceptor)) {
                httpClient.addInterceptor(interceptor);

                restBuilder.client(httpClient.build());
            }
        }

        retrofit = restBuilder.build();
        return retrofit.create(WebService.class);
    }

Пожалуйста, игнорируйте переводчика. Это мой класс генератора услуг, через который вызывается весь веб-сервис. Я вызываю метод POST, который вернет мне простой ответ.

Я вижу свой правильный ответ в "Android Monitor". Но когда он проходит через JsonConverterFactory, он выдает мне ошибку выше. Одно я точно знаю, что веб-сервис возвращает простой текстовый ответ, так как нет ничего конкретного для возврата в приложение. Есть ли способ, которым я могу преобразовать свой текстовый ответ в класс. Пожалуйста, кричите, если я что-то пропустил.

Также добавляю мой метод интерфейса

@Headers({
            Constants.ApiHeader.CONTENT_TYPE_JSON
    })

    @POST("POST_URL/{number}")
    Call<MyResponseModel> getActualProductLocation(@Header("access_token") String accessToken, @Path("number") String number, @Body List<MyRequestModel> body);

Обновление Мне удалось получить фрагмент кода с сервера. Вот как выглядит их ответ:

Response.status(200).entity("Response Success").build()

1 ответ

Поскольку серверная часть не отвечает вам данными в формате JSON, вы должны обработать их с помощью специального конвертера.

Вот пример пользовательского конвертера, который будет соответствовать вашим потребностям.

Фрагмент из StringConverterFactory.java

...
private static class StringConverter implements Converter<String> {
    private static final MediaType PLAIN_TEXT = MediaType.parse("text/plain; charset=UTF-8");

    @Override
    public String fromBody(ResponseBody body) throws IOException {
        return new String(body.bytes());
    }

    @Override
    public RequestBody toBody(String value) {
        return RequestBody.create(PLAIN_TEXT, convertToBytes(value));
    }

    private static byte[] convertToBytes(String string) {
        try {
            return string.getBytes("UTF-8");
        } catch (UnsupportedEncodingException e) {
            throw new RuntimeException(e);
        }
    }
}
...

А потом при создании вашего Retrofit:

Retrofit retrofit = new Retrofit.Builder()
   ...
   .addConverterFactory(StringConverterFactory.create());
   ...
   .build();
Другие вопросы по тегам