如何指定jackson只使用字段 - 最好全局

问题

默认的jackon行为似乎使用两个属性(getter和setter)和字段来序列化和反序列化为json。

我想使用这些字段作为序列化配置的规范来源,因此不希望jackson完全查看属性。

我可以使用注释在单个类的基础上执行此操作:

@JsonAutoDetect(fieldVisibility = Visibility.ANY, getterVisibility = Visibility.NONE, setterVisibility = Visibility.NONE)

但我不想把它放在每一堂课......

是否可以全局配置?喜欢在Object Mapper中添加一些?


#1 热门回答(126 赞)

你可以像这样配置各个ObjectMappers:

ObjectMapper mapper  = new ObjectMapper();
mapper.setVisibilityChecker(mapper.getSerializationConfig().getDefaultVisibilityChecker()
                .withFieldVisibility(JsonAutoDetect.Visibility.ANY)
                .withGetterVisibility(JsonAutoDetect.Visibility.NONE)
                .withSetterVisibility(JsonAutoDetect.Visibility.NONE)
                .withCreatorVisibility(JsonAutoDetect.Visibility.NONE));

如果你想全局设置,我通常通过包装类访问配置的映射器。


#2 热门回答(115 赞)

在Jackson 2.0及更高版本中,你可以简单地使用:

import com.fasterxml.jackson.annotation.JsonAutoDetect;
import com.fasterxml.jackson.annotation.PropertyAccessor;
import com.fasterxml.jackson.databind.ObjectMapper;   

...

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

关闭自动检测。


#3 热门回答(22 赞)

具体为boolean is*()getters:
我花了很多时间:为什么都没有

@JsonAutoDetect(fieldVisibility = Visibility.ANY, getterVisibility = Visibility.NONE, setterVisibility = Visibility.NONE)

没有

setVisibility(PropertyAccessor.SETTER, JsonAutoDetect.Visibility.NONE);
  setVisibility(PropertyAccessor.GETTER, JsonAutoDetect.Visibility.NONE);
  setVisibility(PropertyAccessor.FIELD, JsonAutoDetect.Visibility.ANY);

不适用于我的布尔getter / setter。解决方案很简单:

@JsonAutoDetect(isGetterVisibility = Visibility.NONE, ...          
  setVisibility(PropertyAccessor.IS_GETTER, JsonAutoDetect.Visibility.NONE);