我正在尝试将以下对象转换为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中。由于我正在使用一个视图并且它没有注释,我希望它不会出现在这里。我是否错误地使用了视图,或者我缺少某些其他配置?
答案 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时, 将 需要指定要包含在视图中的属性,每个对象层次结构的级别。