我正在开发一个java客户端/服务器架构,其中客户端使用jackson向服务器发送消息。交换的数据由 Message 类定义:
public class Message {
private Header header; //Object that contains only String
private Object pdu;
public Message() {
}
// Get & Set
[...]
}
由于 pdu 字段,此类可以包含任何对象。例如,Data 对象可以被实例化并添加为消息。
public class Data{
private String name;
private String type;
public Data() {
}
// Get & Set
[...]
}
在服务器端,当收到消息时,我想检索嵌套对象(数据)。但是,当我尝试将 pdu 转换为 Data 对象时,出现以下异常“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"}}
最佳答案
仅从 {"name":"NAME", "type":"TYPE"}
JSON 无法确定 pdu
Java 类型是什么。如果 pdu
可以存储多种不同的对象类型(当前它被声明为 Object
),则必须使用 JSON 字段来告诉 Jackson 实际的 Java 类型是什么,例如通过使用@JsonTypeInfo
:
@JsonTypeInfo(use = Id.NAME, include = As.PROPERTY, property = "type")
@JsonSubTypes({
@JsonSubTypes.Type(value = DataA.class, name = "data-a"),
@JsonSubTypes.Type(value = DataB.class, name = "data-b")
})
另一种方法是为 pdu
字段编写自定义序列化器/反序列化器,如所述 here .
关于java - Jackson 反序列化对象内部字段,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49387061/