我可以忽略杰克逊和杰克逊的二传手吗?弹簧?

时间:2012-10-23 18:33:12

标签: java json spring jackson

我遇到的情况是我从Java传递一个对象到Javascript客户端,并且它是由Spring 3中内置的Jackson映射器序列化的(使用@RequestBody / @ResponseBody和application / json内容类型)< / p>

我遇到的问题是某些类是从具有getter但没有setter的接口实现的。

我确实希望客户端提供getter值,因此我不能使用@JsonIgnore注释,因为它会完全忽略该属性,包括序列化和反序列化。序列化时我需要属性。

还有其他方法吗?

2 个答案:

答案 0 :(得分:2)

可能有一种更简单的方法,但我想提到使用JSON views作为可能的解决方案。 this thread上有一个例子。

您可能需要关于反序列化的不同视图,而不仅仅是序列化,这将是Jackson 2.0功能 - supported by Spring 3.2 and backported into Spring 3.1。仅使用序列化视图是Jackson 1.4以来的一项功能。

我想到的另一个选择是使用custom deserializer

答案 1 :(得分:0)

我一直在找同样的事情。

根据Jackson docs,我们可以在属性,getter或setter上设置@JsonIgnore注释,这会隐藏整个属性,除非我们给setter一个@JsonProperty注释将确保此属性在设置时可见。不幸的是,这不相反。我想在我的回复中显示该属性,但不在我的请求中包含它。

用例是一个自动生成的id,例如。我不希望用户设置,甚至看不到,但他可能会阅读它。

您可以通过隐藏属性本身然后添加@JsonAnyGetter方法来实现此目的。在此方法中,您可以将数据按到任何您想要的形式。表示您只想显示单个名称或标识符或其他格式的复杂属性类也很有用。有更好的方法来做后者,但如果用例不是太复杂,这就足够了。

所以作为例子(我很抱歉,如果这太复杂了):

用户:

public class User {

    private String uid;
    private String customerId;
    private String taxSsnId;

    public String getUid() {
        return uid;
    }

    public void setUid(String uid) {
        this.uid = uid;
    }

    public String getCustomerId() {
        return extCustomerId;
    }

    public void setCustomerId(String extCustomerId) {
        this.extCustomerId = extCustomerId;
    }

    public String getTaxSsnId() {
        return taxSsnId;
    }

    public void setTaxSsnId(String taxSsnId) {
        this.taxSsnId = taxSsnId;
    }

    @JsonIgnore
    public void getId(){
        if (getUid() != null){
            return getUid();
        }
        if (getCustomerId() != null ){
            return getCustomerId();
        }
        return null;
    }
}

环境:

public class Setting {

    @JsonIgnore
    private int id;

    private String key;
    private String value;

    @JsonIgnore
    private User lastUpdatedBy;

    @JsonIgnore
    private Date lastUpdatedAt;

        public int getId() {
        return id;
    }

    public void setId(int id) {
        this.id = id;
    }

    public String getKey() {
        return key;
    }

    public void setKey(String key) {
        this.key = key;
    }

    public String getValue() {
        return value;
    }

    public void setValue(String value) {
        this.value = value;
    }

    public User getLastUpdatedBy() {
        return lastUpdatedBy;
    }

    public void setLastUpdatedBy(User lastUpdatedBy) {
        this.lastUpdatedBy = lastUpdatedBy;
    }

    public Date getLastUpdatedAt() {
        return lastUpdatedAt;
    }

    public void setLastUpdatedAt(Date lastUpdatedAt) {
        this.lastUpdatedAt = lastUpdatedAt;
    }

    @JsonAnyGetter
    private Map<String, String> other() {
        Map<String, String> map = new LinkedHashMap<String, String>();
        map.put( "id", this.getId());
        map.put( "lastUpdatedBy", this.getLastUpdatedBy().getId());
        SimpleDateFormat format = new SimpleDateFormat("E, dd MMM yyyy HH:mm:ss z");
        map.put( "lastUpdatedAt", format.format(this.getLastUpdatedAt()) );
        return map;
    }

}

产生此Request架构(反序列化视图):

{
  "key": "string",
  "value": "string"
}

和此Response架构(序列化视图):

{
  "key": "string",
  "value": "string",
  "id": "12345",
  "lastUpdatedBy": "String",
  "lastUpdatedAt": "String" 
}