java - 获取对象的类

标签 java json gson

我需要知道是否可以执行以下操作。我需要通过 TCP 传递一些对象。我选择使用 Gson 将它们转换为 JSON。但这个对象可以有不同的类型。主要是我有:

public class NetMessage {
    public int code;
    public Object obj;
}

代码和一个可以有不同类类型的对象。在转换为初始类型后如何重建对象?

测试:

public static void main(String[] args) {
    Gsonizer gs = new Gsonizer();
    Invoice v = new Invoice(123, 123, 10.1);
    NetMessage nm = new NetMessage(2, v);
    String s = (String) gs.toNet(nm);
    NetMessage nm2 = (NetMessage) gs.fromNet(s);

    System.out.println("> " +nm2.code);
    System.out.println("> " +(Object)nm2.obj.getClass()); <<<<<<<< *

}

我的*标记了一个完全不同的类型,它是它打印的Gson lib中的内部类: 类com.google.gson.internal.LinkedTreeMap

我怎样才能将对象重建为其初始类型。

编辑: Gson反序列化代码:

public Object fromNet(String obj){
        return  gsonizer.fromJson(obj, NetMessage.class);
    }

最佳答案

基本上,按照你的设置,这是不可能的。

Gson 通过查看目标类型来执行反序列化。当该类型无关紧要时,它有一些默认值。对于Object,该类型是LinkedTreeMap

给定

public class NetMessage {
    public int code;
    public Object obj;
}

return  gsonizer.fromJson(obj, NetMessage.class);

您尚未指定如何反序列化 obj 字段。在这种情况下,Gson 将默认使用 LinkedTreeMap

唯一的解决方案是显式指定 obj 所需的类型。

关于java - 获取对象的类,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22748928/

相关文章:

java - 如何使用 Gson 将嵌套 json 转换为 Map 而不进行类型转换

android - gson.fromJson - 反序列化失败

java - 是否有正则表达式可以防止输入 Javascript?

java - 如何将我的图像从 URL 显示到我的 JLabel (JFrame)

java - 用java提取文本

mysql - Rails with mysql无法创建json类型列

java - Spring WebFlow - setter 方法中的 NullPointerException - 如何很好地处理

javascript - 如何找到两个抽象节点之间的路径

java - 如何使用 Java 创建类以将文档保存在 MongoDB 中

android - 使用 Retrofit 和 Gson 解析 JSON 数组响应