java.lang.IllegalStateException:预期为BEGIN_OBJECT但在第1行第1行为STRING路径$

时间:2017-02-15 14:36:36

标签: android converter retrofit2 gson

在实际提出问题之前,我已经交叉检查了很多参考文献。作为大多数人,我正在调用Web服务并获得上述结果。我的问题更加具体,所以在请求之前让我添加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);
    }

请忽略口译员。这是我的服务生成器类,通过它可以调用所有Web服务。我正在调用一个POST方法,它将返回一个简单的响应。

我可以在" Android Monitor"中看到我的正确答案。但是当它通过JsonConverterFactory时,它会给我上面的错误。有一点我知道Web服务正在返回一个简单的文本响应,因为没有特定的东西可以返回应用程序。有没有办法可以将我的文本响应转换为类。如果我遗漏任何东西,请免费大喊。

还添加我的界面方法

@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 个答案:

答案 0 :(得分:0)

由于后端不会使用JSON格式的数据回复您,因此您必须使用自定义转换器来处理它。

documentation一个可满足您需求的自定义转换器示例。

来自 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();