【问题标题】:java.lang.IllegalStateException: Expected BEGIN_OBJECT but was STRING at line 1 column 1 path $ [duplicate]java.lang.IllegalStateException:预期 BEGIN_OBJECT 但在第 1 行第 1 列路径 $ [重复]
【发布时间】:2017-07-04 06:52:13
【问题描述】:

在实际提出问题之前,我已经交叉检查了很多参考资料。作为大多数人,我正在调用 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);

更新 我设法从服务器获取了部分代码 sn-p。这就是他们的反应:

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

【问题讨论】:

  • 发布MyResponseModel。很可能它的格式不正确。
  • 它是空的,因为服务器没有返回键值对(JSON数据)。我必须在类中定义任何字符串变量吗?
  • 我的问题比较具体怎么回事?这些问题都是一样的:json数据不是转换器所期望的。 gson 转换器可能找不到一个单独的字符串有效的 json(虽然它是)
  • @Android,服务器返回空字符串。
  • 它返回给我一些“响应成功”

标签: android converter retrofit2 gson


【解决方案1】:

因为后端不会用 JSON 格式的数据回复你,所以你必须使用自定义转换器来处理它。

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

来自 StringConverterFactory.java

的 sn-p
...
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();

【讨论】:

  • 嘿,谢谢哥们,我会试试的。我有一个问题。如果我开始使用自定义转换器,我认为我仍然可以使用我的通用转换器,并且它不会干扰我现有的转换器。对吗?
  • 每个 Retrofit 实例可以有一个转换器。您不能动态更改它们。如果您想拥有不同的转换器,则必须使用该转换器初始化不同的 Retrofit 实例。
  • 我遇到了导入问题。这些类是否属于改造?像import retrofit2.Converter;这样的包
  • Converter 带有 Retrofit 的包。
猜你喜欢
  • 1970-01-01
  • 2020-11-09
  • 2018-01-10
  • 2020-03-10
  • 1970-01-01
  • 1970-01-01
  • 2020-01-29
  • 2019-09-02
  • 1970-01-01
相关资源
最近更新 更多