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

标签 java json deserialization converters gson

假设接收以下 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;
    }
}

显然,您甚至有以下类(class):

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 对象。

最佳答案

您可以编写自定义反序列化器 ( 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
}

关于java - 使用GSON将JSON数据转换为Java对象(包括Object类),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21064418/

相关文章:

java - java中如何重复添加一个变量?

java - 强制静态 block 在 start() 方法之前执行

java - 在java中添加/设置ipv4 LAN地址的最佳方式

javascript - 使用 jquery/javascript 填充 json 字符串中缺失的日期

jquery - 如何使用 jquery/javascript 处理 Json

c# - 分配给单个属性的多个 JsonProperty 名称

java - 通用 map 中的 Jackson De/Serializing Date-to-String-to-Date

java - 在 Spring Data Query 中过滤子对象

ios - 如何循环遍历 SwiftyJSON 中的对象?不仅仅是 swift

java - 使用 Gson 解析不同 JSON 对象的列表