java - Jackson 反序列化对象内部字段

标签 java json networking jackson

我正在开发一个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/

相关文章:

c# - 具有复杂类型参数的 WebInvoke 不适用于 Json 端点

linux - 从公共(public)访问 apache 服务器时遇到问题

java - Sdk 版本 28 未找到 AppCompatActivity 库

java - paintComponent 在我的绘图之上绘制其他组件

python - python请求包中data和json参数的区别

networking - VirtualBox端口转发不适用于NAT适配器

Java服务器客户端网络

java - "0"作为浮点文字中的前缀是什么意思?

java - 错误 : Failed to resolve: com. google.girebase :firebase-core:16. 2.0

php - 如何在 PHP 中从 jQuery.Post() 检索数据?