我正在开发一个java客户机/服务器架构,其中客户机使用jackson向服务器发送消息。交换的数据由消息类定义:
public class Message {
private Header header; //Object that contains only String
private Object pdu;
public Message() {
}
// Get & Set
[...]
}由于pdu字段,该类可以包含任何对象。例如,可以实例化数据对象并将其添加为消息。
public class Data{
private String name;
private String type;
public Data() {
}
// Get & Set
[...]
}在服务器端,当收到消息时,我想检索嵌套对象(数据)。但是,当我尝试将"com.fasterxml.jackson.databind.node.ObjectNode转换为数据对象时,无法将以下异常转换为Model.Data。我怎样才能对任何对象执行这种操作。
以下是服务器代码片段:
Socket socket = serverSocket.accept();
is = new DataInputStream(socket.getInputStream());
os = new DataOutputStream(socket.getOutputStream());
BufferedReader in = new BufferedReader(new InputStreamReader(is));
ObjectMapper mapper = new ObjectMapper();
Message message = mapper.readValue(in.readLine(), Message.class);
Data pdu = (Data) message.getPdu(); // Exception here在这里,客户端代码片段:
Message msg = new Message(header, new Data("NAME", "TYPE"));
ObjectMapper mapper = new ObjectMapper();
String jsonStr = mapper.writeValueAsString(msg);
PrintWriter pw = new PrintWriter(os);
pw.println(jsonStr);
pw.flush();注意事项:客户端发送并由服务器接收的消息格式如下:Message{header=Header{type='TYPE', senderAddr='ADDR', senderName='NAME'}, pdu={"name":"NAME","type":"TYPE"}}
发布于 2022-09-21 15:44:52
我知道这是一个老问题,但您可以让Jackson执行Karol在幕后描述的事情,使用object类作为类型源,这样您就不必枚举这些类型。您仍然必须确保您使用的任何对象都是可串行化的,这不是魔术。无论如何,解决方案在javadoc for @JsonTypeInfo中,将您的字段声明为:
@JsonTypeInfo(use=JsonTypeInfo.Id.CLASS, property="pduClass")
Object getPdu();这将向json表示中添加一个"pduClass“字段,但不会影响java模型。
https://stackoverflow.com/questions/49387061
复制相似问题