【问题标题】:Gson How to skip the field when the exception “java.lang.IllegalStateException” occurred?Gson 发生“java.lang.IllegalStateException”异常时如何跳过该字段?
【发布时间】:2018-04-20 18:52:29
【问题描述】:

型号

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跳过数据吗?怎么办???

【问题讨论】:

  • 您用于 API 调用的任何库? (喜欢Retrofit
  • @Prathamesh Toradmal 是的

标签: android gson retrofit okhttp


【解决方案1】:

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

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;
    }
}

【讨论】:

  • 数据可能是字符串、列表等
  • 这是后端的问题。如果你使用改造,你可以覆盖 jsonconvertor。如果数据字段中只有一个数组,那将是正确的。而且在这种情况下,处理3个病例相当困难。
  • 可以使用TypeAdapterFactory TypeAdapter跳过数据吗?
  • 你可以试试,但最好在服务器上尝试修复。应该是这样的:数据:[]
【解决方案2】:

您可以在code申请支票:

If (code == 200){
    // success logic
}
else if(code == 401){
    // failure logic
}

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

【讨论】:

  • 是的,我知道。但我想知道 gson 能做到吗?
  • 是的,那么您必须手动处理data 部分。如果代码是 401,那么再次检查它是否包含数组、字符串或对象
  • 可以使用TypeAdapterFactory TypeAdapter跳过数据吗?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-09-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多