【问题标题】:Convert JSON data to Java object (including the Object class) using GSON使用 GSON 将 JSON 数据转换为 Java 对象(包括 Object 类)
【发布时间】:2023-12-25 05:03:01
【问题描述】:

假设接收到以下 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 数据转换为 SingleJsonObjectRequest 对象?我的意思是,您不能使用以下代码:

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

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

【问题讨论】:

    标签: java json deserialization converter gson


    【解决方案1】:

    您可以编写自定义反序列化器 (https://sites.google.com/site/gson/gson-user-guide#TOC-Writing-a-Deserializer)。

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

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

    并为每种类型使用子类,因为 java 不存储泛型类型信息 例如

    class UserInfoRequest extends JsonRequest<UserInfo>{
    //nothing in here
    }
    

    【讨论】: