由于某种原因,我无法通过ObjectMapper
配置将受保护的字段(没有setter)隐藏为序列化为JSON字符串。
我的POJO:
public class Item {
protected String sn;
private String name;
public Item(){
sn = "43254667";
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getSn() {
return sn;
}
}
我的映射器:
mapper.setVisibility(PropertyAccessor.SETTER, Visibility.PUBLIC_ONLY);
mapper.setVisibility(PropertyAccessor.GETTER, Visibility.PUBLIC_ONLY);
mapper.setVisibility(PropertyAccessor.FIELD, Visibility.NONE);
输出结果为:
{
"sn" : "43254667",
"name" : "abc"
}
更新:我无法修改Item
类,因此我无法使用注释。
答案 0 :(得分:2)
@JsonIgnore
您可以使用@JsonIgnore
为字段或方法添加注释。
它是一个标记注释,表示基于内省的序列化和反序列化功能将忽略带注释的方法或字段。
使用如下:
public class Item {
@JsonIgnore
protected String sn;
...
}
或者如下:
public class Item {
...
@JsonIgnore
public String getSn() {
return sn;
}
}
@JsonIgnore
与混合使用根据您的comment,您可以在修改类时使用混合注释,如answer中所述。
您可以将其视为在运行时添加更多注释的面向方面的方式,以增加静态定义的注释。
首先,定义一个混合注释界面(类也可以):
public interface ItemMixIn {
@JsonIgnore
String getSn();
}
然后配置您的ObjectMapper
以将定义的界面用作POJO的混合:
ObjectMapper mapper = new ObjectMapper();
mapper.addMixIn(Item.class, ItemMixIn.class);
有关其他详细信息,请查看documentation。
BeanSerializerModifier
根据您的comment,您可以考虑BeanSerializerModifier
,如下所示:
public class CustomSerializerModifier extends BeanSerializerModifier {
@Override
public List<BeanPropertyWriter> changeProperties(SerializationConfig config,
BeanDescription beanDesc, List<BeanPropertyWriter> beanProperties) {
// In this method you can add, remove or replace any of passed properties
return beanProperties;
}
}
然后将自定义序列化程序注册为ObjectMapper
中的模块。
ObjectMapper mapper = new ObjectMapper();
mapper.registerModule(new SimpleModule() {
@Override
public void setupModule(SetupContext context) {
super.setupModule(context);
context.addBeanSerializerModifier(new CustomSerializerModifier());
}
});
答案 1 :(得分:0)
您已指示您的映射器序列化公共getter:
mapper.setVisibility(PropertyAccessor.GETTER, Visibility.PUBLIC_ONLY);
这就是为什么杰克逊将序列化sn
字段(你最终在这里有一个公共吸气者)。
要删除序列化的sn
字段,只需使用@JsonIgnore
注释 getter :
public class Item{
protected String sn;
private String name;
public Item(){
sn = "43254667";
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
@JsonIgnore
public String getSn() {
return sn;
}
}
如果您无法为您的课程注释,您可以随时为您的POJO编写自定义序列化程序或使用Mixins