Dam*_*ola 5 java serialization json pojo jackson
我需要在已定义 POJO 的列表中动态排除某些属性。要序列化的主要 POJO 是:
public class Foo
{
List<Bar> bar;
public void setBar(List<Bar> bar)
{
this.bar = bar;
}
public List<Bar> getBar()
{
return this.bar;
}
public static class Bar
{
private int id;
private boolean ignoreId;
private String name;
public void setId(int id)
{
this.id = id;
}
public int getId()
{
return this.id;
}
public void setIgnoreId(boolean ignoreId)
{
this.ignoreId = ignoreId;
}
public boolean isIgnoreId()
{
return this.ignoreId;
}
public void setName(String name)
{
this.name = name;
}
public String getName()
{
return this.name;
}
}
}
Run Code Online (Sandbox Code Playgroud)
如果 ignoreId = true,则 id 将被忽略,如下所示:
[
{ "id": "1", "name": "one" },
{ "name": "two" }
{ "name": "three" }
{ "id": "4", "name": "four" }
]
Run Code Online (Sandbox Code Playgroud)
目前,我已经尝试使用JsonFilter和JacksonJsonViews,但无法获得所需的输出。如果可以为实现这一目标提供任何指示,我会很高兴。
您应该编写一个自定义Jackson 过滤器,它将根据其他属性值过滤掉 POJO 属性。您应该重写该PropertyFilter.serializeAsField()方法以访问序列化对象的实例。这是一个例子:
public class JacksonFilter2 {
@JsonFilter("filter")
public static class Bar {
public final int id;
@JsonIgnore
public final boolean ignoreId;
public final String name;
public Bar(int id, boolean ignoreId, String name) {
this.id = id;
this.ignoreId = ignoreId;
this.name = name;
}
}
public static class ExcludeIdFilter extends SimpleBeanPropertyFilter {
@Override
protected boolean include(BeanPropertyWriter writer) {
return true;
}
@Override
protected boolean include(PropertyWriter writer) {
return true;
}
@Override
public void serializeAsField(Object pojo,
JsonGenerator jgen,
SerializerProvider provider,
PropertyWriter writer) throws Exception {
if (pojo instanceof Bar
&& "id".equals(writer.getName())
&& ((Bar) pojo).ignoreId) {
writer.serializeAsOmittedField(pojo, jgen, provider);
} else {
super.serializeAsField(pojo, jgen, provider, writer);
}
}
}
public static void main(String[] args) throws JsonProcessingException {
List<Bar> bars = Arrays.asList(new Bar(1, false, "one"), new Bar(2, true, "two"));
ObjectMapper mapper = new ObjectMapper();
mapper.setFilters(new SimpleFilterProvider().addFilter("filter", new ExcludeIdFilter()));
System.out.println(mapper.writerWithDefaultPrettyPrinter().writeValueAsString(bars));
}
}
Run Code Online (Sandbox Code Playgroud)
输出:
[ {
"id" : 1,
"name" : "one"
}, {
"name" : "two"
} ]
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
12550 次 |
| 最近记录: |