java.lang.IllegalStateException:期望的BEGIN_OBJECT,但是在第1行第1列路径处为STRING $

问题描述:

在实际询问问题之前,我已经交叉检查了很多参考。正如大多数人所说,我正在调用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监视器”中看到我的正确答案。但是当它通过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() 
+0

帖子'MyResponseModel'。最有可能的是它的格式不正确。 – azizbekian

+0

它是空的,因为服务器没有返回键值对(JSON数据)。我必须在类中定义任何字符串变量吗? – Android

+0

*我的问题更具体*如何?这些问题都是一样的:json数据不是转换器的预期。这是可能的gson转换器不会找到一个单独的字符串有效的json(它是,虽然) –

因为后端不与JSON格式的数据回复你,你有一个自定义的转换器来处理它。

Here's自定义转换器的一个例子,可以满足您的需求。

一个片段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(); 
+0

嘿,感谢哥们,我会试试看。我有一个问题。如果我开始使用自定义转换器,我认为我仍然可以使用我的通用转换器,并且它不会干扰我现有的转换器。是对的吗? – Android

+0

每个Retrofit实例可以有一个转换器。你不能动态改变它们。如果你想有不同的转换器,你必须用这个转换器初始化不同的Retrofit实例。 – azizbekian

+0

我有进口问题。这些课程是否属于改造? Package like'import retrofit2.Converter;' – Android