2012-04-20 62 views
6

我认为杰克逊没有基于方法的序列化,有没有什么办法可以使它基于字段?基于杰克逊字段序列化

例:

class Bean { 
    Integer i; 
    String s; 

    public Integer getI() { return this.i; } 
    public void setI(Integer i) { this.i = i; } 
    public bool isSetI() { return this.i != null; } 

    // same for s as well 
} 

输出JSON有 “i” 和 “塞提”。无论如何,我可以重写这只得到“我”? 此外,如果有一种方法可以做到这一点,而无需向课程添加任何注释(它们是自动生成的)。

+1

此代码不能编译。你可以发布你正在使用的实际代码,以及你如何试图序列化? – 2012-04-20 14:52:55

回答

5

要做到这一点没有标注,你可以通过以下方式串行/解串之前配置ObjectMapper

ObjectMapper om = new ObjectMapper(); 
om.setVisibilityChecker(om.getSerializationConfig().getDefaultVisibilityChecker(). 
      withGetterVisibility(JsonAutoDetect.Visibility.NONE). 
      withSetterVisibility(JsonAutoDetect.Visibility.NONE)); 
6

杰克逊也可以使用领域,是的;但默认情况下只发现公共字段。但是您可以使用@JsonProperty来标记非公开字段。

需要注意的一件事是,如果同时存在方法(setX,getX)和字段(x),方法将具有优先权。这通常不是问题,但如果是这样,则需要明确禁用不使用的方法,方法是向它们添加@JsonIgnore enxt。

10

查看@JsonAutoDetect注释。例如:

@JsonAutoDetect(fieldVisibility=Visibility.ANY, getterVisibility=Visibility.NONE, isGetterVisibility=Visibility.NONE, setterVisibility=Visibility.NONE) 
public class Bean { 
    Integer i; 
    String s; 

    Integer getI() { return this.i; } 
    void setI(Integer i) { this.i = i; } 
    bool isSetI() return { this.i == null; } 

    // same for s as well 
} 
3

接受的答案没有产生预期的结果对我来说。什么对我的作品不添加注释以下面的方式是配置ObjectMapper

ObjectMapper om = new ObjectMapper() 
     .setVisibility(PropertyAccessor.ALL, JsonAutoDetect.Visibility.NONE) 
     .setVisibility(PropertyAccessor.FIELD, JsonAutoDetect.Visibility.ANY); 

这是一个似乎使我更有意义,它使用区域,而不是干将\ setter方法类似于标准Java序列化的方式,将做。