首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >从ID到对象的JSON反序列化

从ID到对象的JSON反序列化
EN

Stack Overflow用户
提问于 2016-07-18 17:50:00
回答 2查看 7.8K关注 0票数 6

为了确保在我的RESTful web服务中来回发送的数据不是多余的,每个嵌套对象都只有ID序列化(MessageUser创建者只有userId序列化,因为客户机和服务器都会知道用户的所有细节)。

序列化工作得很好,产生了以下结果:

代码语言:javascript
运行
复制
{"messageCreatorUser":"60d01602-c04d-4a3f-bbf2-132eb0ebbfc6","messageBody":"Body", ...}

Problem:反序列化不会产生只具有ID的嵌套对象。结果反序列化的嵌套对象为null。

下面是前面提到的MessageUser对象。在这里指定的第三个选项中使用了序列化“策略”:How to serialize only the ID of a child with Jackson

Message.java

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

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

预期反序列化对象:

代码语言:javascript
运行
复制
Message object =
     String messageBody = "Body";
     User messageCreatorUser =
         UUID userId = 60d01602-c04d-4a3f-bbf2-132eb0ebbfc6;

实际反序列化对象:

代码语言:javascript
运行
复制
Message object =
     String messageBody = "Body";
     User messageCreatorUser = null;

就像我说的,我希望创建一个嵌套的User对象,只使用60d01602-c04d-4a3f-bbf2-132eb0ebbfc6的ID。

使用:

  • 野蝇10.0.最后:
    • RESTEasy 3.0.15最后
    • RESTEasy Jackson 2提供商3.0.15最后的
      • Jackson 2.6.3 (注释、核心、数据库等)

为什么结果不同?

EN

Stack Overflow用户

回答已采纳

发布于 2016-07-18 20:37:03

正如这里的答案(Jackson deserialize JsonIdentityReference (alwaysAsId = true))所述,使用setter反序列化器工作得很好,不需要讨厌的自定义反序列化器:

Message.java

代码语言:javascript
运行
复制
    @JsonInclude(JsonInclude.Include.NON_NULL)
    @JsonIdentityInfo(generator = ObjectIdGenerators.PropertyGenerator.class, property = "messageId")
    public class Message implements Serializable {

        private UUID messageId;

        @JsonIdentityReference(alwaysAsId = true)
        private User messageCreatorUser;

        // -- other fields and such --

        public User getMessageCreatorUser() {
            return messageCreatorUser;
        }

        public void setMessageCreatorUser(User messageCreatorUser) {
            this.messageCreatorUser = messageCreatorUser;
        }

        @JsonProperty("messageCreatorUser")
        public void setMessageCreatorUser(String userId) {
            this.messageCreatorUser = new User(userId);
        }

User.java

代码语言:javascript
运行
复制
    @JsonIdentityInfo(generator = ObjectIdGenerators.PropertyGenerator.class, property = "userId")
    public class User implements Serializable {

        private UUID userId;

        // -- other fields --

        public User(String userId) {
            this.userId = UUID.fromString(userId);
        }

    }

请注意,为了使用@JsonIdentityReference(alwaysAsId = true),您需要在某个地方拥有@JsonIdentityInfo(...)

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

https://stackoverflow.com/questions/38443016

复制
相关文章

相似问题

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