java - Gson 不能反序列化继承的类?

标签 java json gson

我有一个简单的 Json 结构,例如:

{"MessageType":"TimeData","TimeData":{"hh":12,"mm":13,"ms":15,"ss":14}}

我设计了以下类来反序列化它:

public class JsonMessage
{
    public enum MessageTypes{
        WhoAreYou,
        TimeData
    }
    JsonMessage(){
    }
    public MessageTypes MessageType;
}
class TimeData extends JsonMessage{
    int hh;
    int mm;
    int ss;
    int ms;

    TimeData() {
    }    
}

我需要将反序列化分成两个阶段:

1- 反序列化以读取 MessageType

2- 根据MessageType 继续反序列化的其余部分

代码很简单:

public void dispatch(Object message, IoSession session)
    {

            Gson gson = new Gson();
            JsonMessage result = gson.fromJson(message.toString(), JsonMessage.class);
            System.out.println(result.MessageType.toString());
            switch (result.MessageType)
                {
                    case WhoAreYou:{
                    //.....
                    break;
                    }
                    case TimeUpdate:
                        TimeData res = new Gson().fromJson(message.toString(), TimeData.class);
                        System.out.println(res.hh);
                        break;
                    default:break;
        }
    }

我的程序可以输入正确的switch-case(即TimeUpdate)但它没有正确解析它(println 打印 0 而不是 12)

你觉得我哪里做错了? 谢谢

最佳答案

问题是您的 JSON 表示一个包含您感兴趣的另一个对象的对象,而您的 Java 只是一个对象。

您实际上可以为每种类型编写反序列化器,并在确定 MessageType 后使用它们:

public static void main(String[] args)
{
    Gson gson = new GsonBuilder().registerTypeAdapter(TimeData.class, new TimeDataDeserializer()).create();
    String json = "{\"MessageType\":\"TimeData\",\"TimeData\":{\"hh\":12,\"mm\":13,\"ms\":15,\"ss\":14}}";
    JsonMessage message = gson.fromJson(json, JsonMessage.class);

    switch(message.MessageType)
    {
        case TimeData:
            TimeData td = new GsonBuilder()
                            .registerTypeAdapter(TimeData.class, new TimeDataDeserializer())
                            .create()
                            .fromJson(json, TimeData.class);
            td.MessageType = message.MessageType
            System.out.println(td.hh);
            break;
        default:
            break;
    }
}

class TimeDataDeserializer implements JsonDeserializer<TimeData>
{
    @Override
    public TimeData deserialize(JsonElement je, Type type, JsonDeserializationContext jdc)  
        throws JsonParseException
    {
        JsonObject jo = je.getAsJsonObject().getAsJsonObject("TimeData");
        Gson g = new Gson();
        return g.fromJson(jo, TimeData.class);
    }
}

关于java - Gson 不能反序列化继承的类?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16220010/

相关文章:

java - 将 JsonArray 对象从字符串解析为返回异常的 java 对象

java - 在 struts-config.xml 中定位类型

java - 错误: Cannot find symbol -- How do I get my class to compile when it depends on a class in a subfolder?

java - Android gson 无效 ClassCastException

php - Utf8、瑞典字符、Doctrine、Mysql 和 Json 序列化

javascript - JQuery - 通过获取 html 元素、单击属性来创建数组对象

android - 无法合并 dex gradle 3.0.1

java - 使用 jsvc 对 java 程序进行守护进程

java - 如何将 MySQL 表的列的值检索到代码中?

java - 游戏编程性能