Gson如何在发生异常“java.lang.IllegalStateException”时跳过该字段?

时间:2017-11-08 07:17:25

标签: android gson retrofit okhttp

模型

public class Result<T> {
    private String code;
    private String msg;
    private T data;

    public String getCode() {
        return code;
    }

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

    public String getMsg() {
        return msg;
    }

    public void setMsg(String msg) {
        this.msg = msg;
    }

    public T getData() {
        return data;
    }

    public void setData(T data) {
        this.data = data;
    }
}

Api结果

成功(数据可能是字符串,列表等)

{
    "code":200,
    "msg":"success",
    "data":{
               "name":"zhangsan",
                "age":18
             }
}

失败

{
    "code":401,
    "msg":"success",
    "data":[]
}

{
    "code":401,
    "msg":"success",
    "data":""
}

当结果为失败时,发生异常

java.lang.IllegalStateException: Expected BEGIN_OBJECT but was BEGIN_ARRAY at line 1 column 23 path $.data

我只想跳过“数据”字段,因为在失败结果时它未被使用, 并保持其他领域。不例外

可以使用TypeAdapterFactory TypeAdapter跳过数据吗?我该怎么做???

2 个答案:

答案 0 :(得分:0)

问题出在您的模型中。没错,这是真的。

public class JsonData{

    @SerializedName("code")
    private Long mCode;
    @SerializedName("data")
    private Data mData;
    @SerializedName("msg")
    private String mMsg;

    public Long getCode() {
        return mCode;
    }

    public void setCode(Long code) {
        mCode = code;
    }

    public Data getData() {
        return mData;
    }

    public void setData(Data data) {
        mData = data;
    }

    public String getMsg() {
        return mMsg;
    }

    public void setMsg(String msg) {
        mMsg = msg;
    }

}


public class Data {

    @SerializedName("age")
    private Long mAge;
    @SerializedName("name")
    private String mName;

    public Long getAge() {
        return mAge;
    }

    public void setAge(Long age) {
        mAge = age;
    }

    public String getName() {
        return mName;
    }

    public void setName(String name) {
        mName = name;
    }
}

答案 1 :(得分:0)

您可以对code

进行检查
If (code == 200){
    // success logic
}
else if(code == 401){
    // failure logic
}

否则,如果您使用的是Retrofit库,则应自动转到successfailure。你不需要照顾它。使用this链接从服务器获取的Response创建Pojo类。