隐藏杰克逊序列化中受保护的字段

时间:2017-04-25 08:13:37

标签: java json jackson

由于某种原因,我无法通过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类,因此我无法使用注释。

2 个答案:

答案 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