gpt4 book ai didi

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

转载 作者:塔克拉玛干 更新时间:2023-11-01 22:28:50 25 4
gpt4 key购买 nike

我有一个简单的 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/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com