【问题标题】:java.lang.IllegalStateException: Expected a string but was BEGIN_OBJECT at line 1 column 2 path $java.lang.IllegalStateException:应为字符串,但在第 1 行第 2 列路径 $ 处为 BEGIN_OBJECT
【发布时间】:2015-09-06 10:49:35
【问题描述】:

我创建了 Retrofit 界面

public interface UserService {
    @GET(Constants.Api.URL_LOGIN)
    Call<String> loginUser(@Query("email") String email, @Query("password") String pass, @Query("secret") String secret, @Query("device_id") String deviceid, @Query("pub_key") String pubkey, @Query("device_name") String devicename);

在活动中我打电话

final Call<String> responce = service.loginUser(loginedt.getText().toString(), md5(passwordedt.getText().toString()), secret, device_id, pub_key, device_name);

                    responce.enqueue(new Callback<String>() {
                        @Override
                        public void onResponse(Response<String> response) {
                            if (response.code() == Constants.Status.ERROR_404) {
                                Toast.makeText(LoginActivity.this, getResources().getString(R.string.wrong_log_pass), Toast.LENGTH_LONG).show();
                            } else if (response.code() != Constants.Status.ERROR_404 && response.code() != Constants.Status.SUCCES) {
                                Toast.makeText(LoginActivity.this, getResources().getString(R.string.wrong_request), Toast.LENGTH_LONG).show();
                            } else {
                                startActivity(new Intent(LoginActivity.this, MainActivity.class));
                            }
                        }

                        @Override
                        public void onFailure(Throwable t) {
                            t.printStackTrace();

                        }
                    });

我遇到错误

onFailure java.lang.IllegalStateException: 应为字符串,但在第 1 行第 2 列路径 $ 处为 BEGIN_OBJECT

【问题讨论】:

  • 通常这些错误是因为 GSon 无法从您的对象中解析您的 json。也为用户发布您的模型。让我们看看一切是否正确
  • 我不发布任何对象。仅限@Query 字符串
  • 我不确定 100%,但我认为您需要一个实体类来进行改造。原因是它在内部使用 Gson,如果你没有任何实体类 Retrofit 不知道如何解析 POST、GET 数据

标签: android retrofit


【解决方案1】:

如果您不创建自己的模型,请使用Call&lt;JsonObject&gt;

这是应用程序/json 内容类型请求的默认解析器。

【讨论】:

  • 谢谢你救了我
【解决方案2】:

您的 API 的响应是什么? Retrofit 将服务器响应解析为传递给调用对象的类型,即Call&lt;ResponseType&gt;。从您收到的错误开始,服务器在您期待一个字符串时返回对象。
将您的服务更改为

Call<ResponseTypeObject> loginUser(@Query("email") String email, @Query("password") String pass, @Query("secret") String secret, @Query("device_id") String deviceid, @Query("pub_key") String pubkey, @Query("device_name") String devicename);

ResponseTypeObject 是从服务器返回的响应实体

【讨论】:

    【解决方案3】:

    每当 Gson 转换器无法将 Json 对象从服务器解析为预期的返回类型(在您的情况下为字符串)时,就会发生此类错误。在这种情况下,请将返回类型从 Call&lt;String&gt; 更改为 Call&lt;ResponseBody&gt;

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2019-11-27
      • 2020-04-10
      • 1970-01-01
      • 2022-07-20
      • 2021-08-02
      • 1970-01-01
      • 2022-11-25
      • 2021-09-03
      相关资源
      最近更新 更多