首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >Jackson反序列化对象内部字段

Jackson反序列化对象内部字段
EN

Stack Overflow用户
提问于 2018-03-20 14:34:17
回答 2查看 874关注 0票数 1

我正在开发一个java客户机/服务器架构,其中客户机使用jackson向服务器发送消息。交换的数据由消息类定义:

代码语言:javascript
复制
public class Message {
    private Header header; //Object that contains only String
    private Object pdu;

    public Message() {
    }

    // Get & Set
    [...]
}

由于pdu字段,该类可以包含任何对象。例如,可以实例化数据对象并将其添加为消息。

代码语言:javascript
复制
public class Data{
    private String name;
    private String type;

    public Data() {
    }

    // Get & Set
    [...]
}

在服务器端,当收到消息时,我想检索嵌套对象(数据)。但是,当我尝试将"com.fasterxml.jackson.databind.node.ObjectNode转换为数据对象时,无法将以下异常转换为Model.Data。我怎样才能对任何对象执行这种操作。

以下是服务器代码片段:

代码语言:javascript
复制
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

在这里,客户端代码片段:

代码语言:javascript
复制
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"}}

EN

Stack Overflow用户

发布于 2022-09-21 15:44:52

我知道这是一个老问题,但您可以让Jackson执行Karol在幕后描述的事情,使用object类作为类型源,这样您就不必枚举这些类型。您仍然必须确保您使用的任何对象都是可串行化的,这不是魔术。无论如何,解决方案在javadoc for @JsonTypeInfo中,将您的字段声明为:

代码语言:javascript
复制
    @JsonTypeInfo(use=JsonTypeInfo.Id.CLASS, property="pduClass")
    Object getPdu();

这将向json表示中添加一个"pduClass“字段,但不会影响java模型。

票数 0
EN
查看全部 2 条回答
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/49387061

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档