【发布时间】:2016-11-21 10:23:09
【问题描述】:
为了确保在我的 RESTful Web 服务中来回发送的数据不是多余的,每个嵌套对象都只有它的 ID 序列化(Message 的 User 创建者只有 userId 序列化,因为两者客户端和服务器已经知道用户的所有详细信息)。
序列化工作完美,产生这个:
{"messageCreatorUser":"60d01602-c04d-4a3f-bbf2-132eb0ebbfc6","messageBody":"Body", ...}
问题:反序列化不会生成只有其 ID 的嵌套对象。生成的反序列化嵌套对象为 null。
这里是前面提到的Message 和User 对象。序列化“策略”是从此处指定的第三个选项中使用的:How to serialize only the ID of a child with Jackson。
Message.java
@JsonInclude(JsonInclude.Include.NON_NULL)
@JsonIdentityInfo(generator = ObjectIdGenerators.PropertyGenerator.class, property = "messageId")
public class Message implements Serializable {
// -- Hibernate definitions omitted --
private UUID messageId;
// -----------------------------------------------------------------
// Here is what makes the serializer print out the ID specified on the class definition
@JsonIdentityReference(alwaysAsId = true)
// Here is my attempt to get the User class back when I deserialize
@JsonDeserialize(as = User.class)
@JsonSerialize(as = User.class)
private User messageCreatorUser;
// ------------------------------------------------------------------
// -- more arbitrary properties --
public Message() {
}
public Message(UUID messageId) {
this.messageId = messageId;
}
public Message(String messageId) {
this.messageId = UUID.fromString(messageId);
}
// -- getters and setters --
User.java
@JsonIdentityInfo(generator = ObjectIdGenerators.PropertyGenerator.class, property = "userId")
@JsonInclude(JsonInclude.Include.NON_NULL)
public class User implements Serializable {
private UUID userId;
// -- other arbitrary properties --
public User() {
}
public User(UUID userId) {
this.userId = userId;
}
public User(String userId) {
this.userId = UUID.fromString(userId);
}
// -- getters and setters --
预期的反序列化对象:
Message object =
String messageBody = "Body";
User messageCreatorUser =
UUID userId = 60d01602-c04d-4a3f-bbf2-132eb0ebbfc6;
实际反序列化对象:
Message object =
String messageBody = "Body";
User messageCreatorUser = null;
就像我说的,我希望创建一个嵌套的 User 对象,其 ID 仅为 60d01602-c04d-4a3f-bbf2-132eb0ebbfc6
使用:
- Wildfly 10.0.Final:
- RESTEasy 3.0.15.Final
- RESTEasy Jackson 2 提供程序 3.0.15.Final
- Jackson 2.6.3(注解、核心、数据绑定等)
为什么结果不同?
【问题讨论】:
标签: java json serialization jackson