gpt4 book ai didi

java - 如何在不知道 .class 先验的情况下使用 Gson 在 Java 中反序列化和返回 JSON 中的对象?

转载 作者:行者123 更新时间:2023-12-03 23:08:27 26 4
gpt4 key购买 nike

我目前正在开发一个瘦客户端应用程序,其中的通信通过 JSON 序列化的消息对象进行。服务器序列化消息,通过套接字发送,客户端接收并反序列化。答案以同样的方式发生。

首先,我们假设在服务器和客户端都定义了消息类。

问题是 Gson::fromJson 函数需要一个 .class/type 对象来通过自省(introspection)反序列化(可以理解),但在我的应用程序中,可以在不知道 .class 的情况下接收多种类型的对象提前。

我的想法是创建一个这样的消息包装器:

class MessageWrapper {
public class MessageWrapper(Object message, MessageType type) {
this.message = message;
this.type = type;
}

// getters...

public enum MesssageType {
PLACEMENT,
UPDATE,
// ...
}

private final Object message;
private final MessageType type;
}

或者甚至通过内省(introspection)确定 type 参数来更进一步。这个解决方案非常适合序列化(我重复一遍,这不是问题),但是在反序列化时我会获取消息类型并丢失消息本身,至少如果我不解析它两次。通过 Java“模板化”机制专门化 MessageWrapper 让我们回到最初的问题(我会有多个类可供选择)。

另一个想法是在 JSON 字符串之前发送一个 token 来识别消息,例如:

Placement={"foo": 2, "bar": "baz"}

然后读取 token 以确定.class 类型。这可行,但仍然存在问题:如何从我的 receive 函数返回值?当然可以:

public Object receive(Reader stream) {}

并强制用户进行沮丧,但我宁愿避免它。

编辑:这是因为客户端具有类似 react 堆的结构:它在循环中运行并将消息分派(dispatch)给适当的处理程序。

最佳答案

使用 Gson,如果你有合理数量的可能消息,你可以创建一个包含所有消息的类(类似于 @Enrichman 写的,但你不需要检查空...)。例如,如果您有类(class)

public class Response {
private Placement placement;
private Update update;
//more message types
//getters & setters
}

然后您可以反序列化您的响应:

Gson gson = new Gson();
Response response = gson.fromJson(jsonString, Response.class);

它会反序列化这个 JSON:

{"placement": {...} }

还有这个:

{"update": {...} }

还有这个:

{"placement": {...}, "update": {...} }

Gson 将忽略 JSON 响应中不对应于类中任何属性的所有字段,因此您可以使用单个类来反序列化多个响应...

关于java - 如何在不知道 .class 先验的情况下使用 Gson 在 Java 中反序列化和返回 JSON 中的对象?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16936919/

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