Gson解析为覆盖变量的子类

Gson parse to subclass that overrides variable

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

我的网络服务器总是return一个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; }
}

然后我有一个 'real' 回复 class:

public class LoginResponse extends BaseResponse {
    private UserData data;

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

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

我尝试像这样解析响应:

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

但是它在 fromJson() 上抛出一个异常说:

LoginResponse declares multiple JSON fields named data

如何解决此问题并在 BaseResponse 中保留数据变量?

您可以使用泛型类型。

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 可以是您想要的任何对象。