使用GSON将JSON数据转换为Java对象(包括对象类)

使用GSON将JSON数据转换为Java对象(包括对象类),java,json,deserialization,converter,gson,Java,Json,Deserialization,Converter,Gson,让我们假设接收以下JSON数据: { "request" : "connection_status", "data" : { "id" : "foo", "username" : "bar" } } 您希望将其反序列化为Java对象,其类定义如下: public class SingleJsonObjectRequest { private String request; private Object data; public String getRe

让我们假设接收以下JSON数据:

{
    "request" : "connection_status",
    "data" : { "id" : "foo", "username" : "bar" }
}
您希望将其反序列化为Java对象,其类定义如下:

public class SingleJsonObjectRequest {
    private String request;
    private Object data;

    public String getRequest() {
        return request;
    }

    public void setRequest(String request) {
        this.request = request;
    }

    public Object getData() {
        return data;
    }

    public void setData(Object data) {
        this.data = data;
    }
}
显然,您甚至有以下课程:

public class UserInfo {
    private String id;
    private String username;

    public String getId() {
        return id;
    }

    public UserInfo setId(String id) {
        this.id = id;
        return this;
    }

    public String getUsername() {
        return username;
    }

    public UserInfo setUsername(String username) {
        this.username = username;
        return this;
    }
}
可通过调用以下命令将其包括在SingleJsonObjectRequest中:

singleObjReq.setData(new UserInfo());
有没有办法将JSON数据转换为单个JSONObjectRequest对象?我的意思是,您不能使用以下代码:

SingleJsonObjectRequest singleObjReq = gson.fromJson(jsonReq, SingleJsonObjectRequest.class);

因为SingleJsonObjectRequest有一个通用数据对象,而不是UserInfo对象。

您可以编写一个自定义反序列化程序()

IMHO,您必须为要发送/接收的每种数据类型使用单独的类。您可以像这样创建一个泛型基类

class JsonRequest<T>{
  private String request;
    private T data;

    public String getRequest() {
        return request;
    }

    public void setRequest(String request) {
        this.request = request;
    }

    public T getData() {
        return data;
    }

    public void setData(T data) {
        this.data = data;
    }
}
类JsonRequest{
私有字符串请求;
私有T数据;
公共字符串getRequest(){
返回请求;
}
公共void setRequest(字符串请求){
this.request=请求;
}
公共T getData(){
返回数据;
}
公共无效设置数据(T数据){
这个数据=数据;
}
}
并为每种类型使用子类,因为java不存储泛型类型信息 比如说

class UserInfoRequest extends JsonRequest<UserInfo>{
//nothing in here
}
类UserInfoRequest扩展了JsonRequest{ //这里什么都没有 }