杰克逊没有忽视未经注释的领域

时间:2013-06-06 18:35:31

标签: java json jackson

我正在尝试将以下对象转换为JSON:

public class Product {
    private ProductEntity productEntity;
    private Priority priority;

    public Product() {

    }

    public Product(ProductEntity productEntity, Priority priority) {
        this.productEntity = productEntity;
        this.priority = priority;
    }

    public ProductEntity getProductEntity() {
        return productEntity;
    }

    private void setProductEntity(ProductEntity productEntity) {
        this.productEntity = productEntity;
    }

    @JsonView({Views.ShutdownView.class})
    public Priority getPriority() {
        return priority;
    }

使用此代码:

    logger.info("Booting up: "+this);
    mapper.getSerializationConfig().withView(Views.ShutdownView.class);

    //recover previously saved queue if needed
    if (getEntity().getQueue() != null && getEntity().getQueue().length > 0) {
        try {
            queue = mapper.readValue(getEntity().getQueue(), new TypeReference<ArrayList<JobSet>>() {});

            //now that it's read correctly, erase the saved data
            getEntity().setQueue(null);
            workflowProcessService.save(getEntity());
        } catch (IOException e) {
            e.printStackTrace();
            logger.info("Unable to parse JSON");
        }
    }

由于某种原因,getProductEntity()的输出继续显示在JSON中。由于我正在使用一个视图并且它没有注释,我希望它不会出现在这里。我是否错误地使用了视图,或者我缺少某些其他配置?

1 个答案:

答案 0 :(得分:1)

这是well documented behavior。具体做法是:

  

处理&#34;无视图&#34;特性

     

默认情况下,所有没有显式视图定义的属性都包含在序列化中。但从Jackson 1.5开始,您可以通过以下方式更改此默认值:

     
    

objectMapper.configure(SerializationConfig.Feature.DEFAULT_VIEW_INCLUSION, false);

  
     

其中false表示在启用视图时不包含此类属性。此属性的默认值为&#39; true&#39;。

如果您使用的Jackson版本低于1.8,您应该可以修改对象映射器,如上面的代码所示,并且默认情况下为&#39;属性将不再包含在序列化数据中。如果您使用的是1.9或更高版本,请使用以下代码作为指南:

final ObjectMapper mapper = new ObjectMapper();
mapper.configure(MapperFeature.DEFAULT_VIEW_INCLUSION, false);

final ObjectWriter writer = mapper
        .writerWithView(Views.ShutdownView.class);
final Product product = new Product(new ProductEntity("Widget",
        BigDecimal.valueOf(10)), new Priority("high"));
System.out.println(writer.writeValueAsString(product));

输出:

  

{&#34;优先级&#34; {&#34;代码&#34;:&#34;高&#34;}}

请注意,当您将DEFAULT_VIEW_INCLUSION配置为false时, 需要指定要包含在视图中的属性,每个对象层次结构的级别。