【问题标题】:Why am i getting this error - java.lang.IllegalStateException: Expected a string but was BEGIN_OBJECT at line 1 column 2 path $为什么我会收到此错误 - java.lang.IllegalStateException: Expected a string but was BEGIN_OBJECT at line 1 column 2 path $
【发布时间】:2018-03-07 05:33:00
【问题描述】:

这是我的回应 {"message":"Success","draft_id":"5a9f70021207b061128b4567"}

这是我的 POJO 类:

public class SaveNoteModel {

    @SerializedName("message")
    @Expose
    private String message;
    @SerializedName("draft_id")
    @Expose
    private String draftId;

    public String getMessage() {
        return message;
    }

    public void setMessage(String message) {
        this.message = message;
    }

    public String getDraftId() {
        return draftId;
    }

    public void setDraftId(String draftId) {
        this.draftId = draftId;
    }
}

我使用标量 retrofit2:converter-scalars:2.1.0 将所有响应转换为字符串。 这是改装电话

ApiInterface apiInterface = RetrofitClient.getStringClient(ApiConstants.SAVE).create(ApiInterface.class);
        Call<String> call = apiInterface.saveNoteCall(userid,pcontract,scontract,action_type,headline,description,mediaOption,media,msf_symbol,mediaUrl,fileName,mediaIcon);
        call.enqueue(new Callback<String>() {
            @Override
            public void onResponse(Call<String> call, Response<String> response) {
                Log.d("Retrofit", String.format("Data is: %s", response.body()));

                String res  =  response.body().toString();
                //res=  "{"+ "object_: "+res+"}";
                SaveNoteModel menuModel = new Gson().fromJson(res, SaveNoteModel.class);
                if (menuModel != null) {
                    onResponseReceiveEvent.getSuccess(menuModel);
                } else {
                    onResponseReceiveEvent.getFailure();
                    Log.d("Retrofit", String.format("Error is: %s", response.errorBody()));
                }
            }

            @Override
            public void onFailure(Call<String> call, Throwable t) {
                call.cancel();
                onResponseReceiveEvent.getFailure();
                Log.d("Retrofit", String.format("Error is: %s", t));
            }

【问题讨论】:

  • 您的改造电话可能类似于Call&lt;String&gt;,但作为回应,您正在为此获得对象,您的改造电话必须是Call&lt;JsonObject&gt;
  • @HemantParmar 您分享了一个我无法在我的代码中解析的链接。请帮帮我。

标签: android retrofit2 gson


【解决方案1】:

你得到的是一个对象而不是一个字符串。它期望在字符串中。您可以将返回类型更改为对象,也可以返回一个字符串。 JSON中[...]代表数组,{...}代表对象,[{...}]是包含一个对象的数组。尝试使用

Gson gson = new Gson();
Message[] message= gson.fromJson(json, Message[].class);
System.out.println(Arrays.toString(message));
System.out.println(message[0]);

【讨论】:

  • 感谢您的评论,但在我的情况下,它进入 void onFailure(Call call, Throwable t) 。如果它继续 void onResponse() 我可以照你说的做。
【解决方案2】:

您应该尝试返回 SaveNoteModel 的对象而不是字符串 像这样更改您的代码,

ApiInterface apiInterface = RetrofitClient.getStringClient(ApiConstants.SAVE).create(ApiInterface.class);
    Call<SaveNoteModel> call = apiInterface.saveNoteCall(userid,pcontract,scontract,action_type,headline,description,mediaOption,media,msf_symbol,mediaUrl,fileName,mediaIcon);
    call.enqueue(new Callback<SaveNoteModel>() {
        @Override
        public void onResponse(Call<SaveNoteModel> call, Response<SaveNoteModel> response) {
            Log.d("Retrofit", String.format("Data is: %s", response.body()));

            String res  =  response.body().toString();
            //res=  "{"+ "object_: "+res+"}";
            SaveNoteModel menuModel = new Gson().fromJson(res, SaveNoteModel.class);
            if (menuModel != null) {
                onResponseReceiveEvent.getSuccess(menuModel);
            } else {
                onResponseReceiveEvent.getFailure();
                Log.d("Retrofit", String.format("Error is: %s", response.errorBody()));
            }
        }

        @Override
        public void onFailure(Call<SaveNoteModel> call, Throwable t) {
            call.cancel();
            onResponseReceiveEvent.getFailure();
            Log.d("Retrofit", String.format("Error is: %s", t));
        }

注意:还要将 ApiInterface 类中的返回类型更改为 SaveNoteModel

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2017-04-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-06-16
    • 1970-01-01
    • 1970-01-01
    • 2023-01-29
    相关资源
    最近更新 更多