在改造android中解析响应时出错

时间:2018-03-26 09:31:03

标签: android rest retrofit

我第一次尝试在Android中使用Retrofit。我成功地召集了一个电话,但我对以下情况感到震惊: 我得到的回复有两种: 回复-1:成功回复

{
    "results": {
        "message": {
            "en": 301000897837,
            "ete": "PM",
            "vto": "PM",
            "er": false
        },
        "status": "Success",
        "code": 200
    }
}

响应-2:错误响应

{
    "results": {
        "message": "Invalid",
        "status": "No Content",
        "code": 204
    }
}

我创建了两个POJO类,即EwResponse.classEwResults.class

public class EwayBillResponse {

    @SerializedName("results")
    @Expose
    private EwayBillResults results;

    /**
     * No args constructor for use in serialization
     *
     */
    public EwayBillResponse() {
    }

公共课EwResults {

@SerializedName("message")
@Expose
private String message;
@SerializedName("status")
@Expose
private String status;
@SerializedName("code")
@Expose
private Integer code;

/**
 * No args constructor for use in serialization
 *
 */
public EwResults() {
}

我可以打电话并分析响应错误响应的错误情况。 我知道我在message POJO中没有使用success_response成功回复,但我对如何在api调用改造中使用两种类型的响应调用一无所知。

这是我在成功回复时遇到的以下错误:

java.lang.IllegalStateException: Expected a string but was BEGIN_OBJECT at line 1 column 24 path $.results.message

这是我第一次使用改装。所以请帮助我。

提前致谢 修改 请求致电代码:

Call<EwResponse> ewcall=apiService.generateEB(EwResponse);
                            ewcall.enqueue(new Callback<EwResponse>() {
                                @Override
                                public void onResponse(@NonNull Call<EwResponse> call, @NonNull Response<EwResponse> response) {
                                    if(response.isSuccessful()&&response.body().getResults().getCode()==200){
                                        Gson gson=new Gson();
                                        EwMessage EwMessage=gson.fromJson(response.body().getResults().getMessage(),EwMessage.class);
                                    }else{
                                        Toast.makeText(getActivity(), ""+response.body().getResults().getMessage(), Toast.LENGTH_SHORT).show();
                                    }
                                }

                                @Override
                                public void onFailure(@NonNull Call<EwResponse> call, @NonNull Throwable t) {
                                    progressDialog.dismiss();
                                    Log.e("ERROR",""+t.getMessage());
                                }

                            });

1 个答案:

答案 0 :(得分:0)

您需要动态处理字符串响应和对象响应的情况,使用此

    public class Results {

@SerializedName("message")
@Expose
private Object message;
@SerializedName("status")
@Expose
private String status;
@SerializedName("code")
@Expose
private Integer code;

public Object getMessage() {
return message;
}

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

public String getStatus() {
return status;
}

public void setStatus(String status) {
this.status = status;
}

public Integer getCode() {
return code;
}

public void setCode(Integer code) {
this.code = code;
}

}

results对象内,您有一个名为message的字段,可以是object/string

所以内部改造onResponse方法,

if (response.getMessage() instanceof Message)
        {
        handleObjectResponse();
     }
    else 
        {
        handleStringResponse();
     }

Message.java

public class Message {

@SerializedName("en")
@Expose
private Integer en;
@SerializedName("ete")
@Expose
private String ete;
@SerializedName("vto")
@Expose
private String vto;
@SerializedName("er")
@Expose
private Boolean er;

public Integer getEn() {
return en;
}

public void setEn(Integer en) {
this.en = en;
}

public String getEte() {
return ete;
}

public void setEte(String ete) {
this.ete = ete;
}

public String getVto() {
return vto;
}

public void setVto(String vto) {
this.vto = vto;
}

public Boolean getEr() {
return er;
}

public void setEr(Boolean er) {
this.er = er;
}

}