Json:生成对象id而不是真实对象

时间:2012-04-19 12:04:53

标签: json jackson

在我的服务器上,我有复杂的对象,但在我的Web客户端中,我希望得到这些对象的简单表示。 我想用他们的id替换对象,例如:

@JsonAutoDetect
public class Event{
    private Long id;
private String name;
    private User user;

    @JsonProperty("event_id")
public Long getId() {
     return event_id;
    }
    public String getName() {
     return name;
    }
    public String getUser() {
     return user;
    }
    ....setters
}

生成Json时,我会在里面获得Event类和用户类 无论如何用用户ID替换用户? 由于我有许多复杂的对象,我正在寻找一种优雅的方式,就像User对象上的注释一样,它只返回对象id。

当然,我需要相反的方式。获取id并将其转换为对象。

BTW:我正在使用杰克逊

任何想法?

10倍 诺姆

2 个答案:

答案 0 :(得分:0)

您可以公开Id的属性并忽略子实体属性,如下所示:

class Event {
    private User user;

    public Long getUserId() {
        return user.getId();
    }

    public void setUserId(Long userId) {
        this.user = retrieveUserById(userId); // or any other code         
    }

    @JsonIgnore
    public User getUser() {
        return user;
    }

    public void setUser(User user) {
        this.user = user;
    }
}

答案 1 :(得分:0)

这是我的想法如何实现它。您可以在@JsonRawValue(true)媒体资源上使用user注释。这将使杰克逊将user对象视为已经序列化的东西。然后只需覆盖.toString()类的User方法,使其以字符串形式返回id。

所以在你的Event课程中:

public class Event {
    ...
    @JsonRawValue(true)
    private User user;
    ...
}

在你的User课程中:

public class User {
    ...
    private Integer id;
    ...
    @Override
    public String toString() {
        return id.toString();
    }
    ...
}

这将导致例如你的json中"user": 5(在User对象serizlized值附近不会添加双引号。)