【问题标题】:Gson parse to subclass that overrides variableGson 解析为覆盖变量的子类
【发布时间】:2015-12-15 14:45:49
【问题描述】:

我想做一些响应 POJO 类,我将从我的网络服务器收到。

我的网络服务器将始终以这种结构返回一个 json:

{
    'data':Object or array or null,
    'status':Integer,
    'message':String or null
}

这是基本响应:

public class BaseResponse {
    private Object data;
    private int status;
    private String message;

    public Object getData() { return this.data; }
    public int getStatus() { return this.status; }
    public String getMessage() { return this.message; }
}

然后我有一个“真正的”响应类:

public class LoginResponse extends BaseResponse {
    private UserData data;

    @Override
    public UserData getData() { return data; }
}

UserData 是另一个类,看起来与这些完全相同,但具有不同的变量名称(id 和名称)。

我尝试像这样解析响应:

try {
    LoginResponse json = gson.fromJson(jsonString, LoginResponse.class);
    Log.i(PF.TAG, "ID: " + json.getData().getName());
}

但它会在 fromJson() 上抛出异常:

LoginResponse 声明了多个名为 data 的 JSON 字段

我怎样才能解决这个问题,并且在 BaseResponse 中仍然有数据变量?

【问题讨论】:

    标签: java json class gson pojo


    【解决方案1】:

    您可以使用泛型类型。

    public class BaseResponse<T> {
    
        private T data;
        private int status;
        private String message;
    
        public T getData(){
            return this.data;
        }
    
        public int getStatus(){
            return this.status;
        }
    
        public String getMessage(){
            return this.message;
        }
    }
    

    响应类型示例:

    public class LoginResponse extends BaseResponse<UserData>{
    
    }
    

    那么你可以使用:

    LoginResponse json = gson.fromJson(jsonString, LoginResponse.class);
    Log.i(PF.TAG, "ID: " + json.getData().getName());
    

    使用此方法,T 可以是您想要的任何对象。

    【讨论】:

    • 为什么我没有想到那个 x) 现在我什至不需要子类...谢谢!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2023-04-01
    • 2021-08-24
    • 1970-01-01
    • 2016-03-03
    • 1970-01-01
    • 2010-10-10
    • 2013-06-03
    相关资源
    最近更新 更多