0

我正在尝试将以下对象转换为 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 中。由于我使用的是视图并且没有注释,我希望它不会出现在这里。我是在错误地使用视图还是在我缺少的地方有其他配置?

4

1 回答 1

1

这是有据可查的行为。具体来说:

处理“无视图”属性

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

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

其中 false 表示使用视图启用时不包含此类属性。此属性的默认值为“true”。

如果您使用的 Jackson 版本低于 1.8,您应该能够修改您的对象映射器,如上面的代码所示,并且“默认”属性将不再包含在序列化数据中。如果您使用的是 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));

输出:

{“优先级”:{“代码”:“高”}}

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

于 2013-06-07T00:33:10.717 回答