我在写代码由杰克逊的结构定义需要访问类的属性列表。
例如,对于下面这个类:
@JsonIgnoreProperties(value = { "intValue" })
public class MyDto {
@JsonProperty("name")
private String stringValue;
private int intValue;
private long longValue;
@JsonIgnore
private boolean booleanValue;
// standard setters and getters are not shown
}
我会得到[name,longValue]
,因为这是杰克逊序列化时,实际上考虑的属性。
我不认为写一整块的代码来寻找getter / setter方法,检查杰克逊注解是要走的路,因为这将被重新实现杰克逊。
如果我能得到杰克逊的手柄ObjectMapper
用于序列化,是有办法得到的属性列表Class<?>
或Type
对象?(尊重杰克逊注释和CONFIG)
我挖了一下到杰克逊的实施,并找到了POJOPropertiesCollector
,但我不知道我该如何使用它从外部杰克逊(我们不应该这样做,我相信)。
作为最后的手段,我可以创建我检查类的一个实例,与ObjectMapper序列化,然后解析JSON找到属性名称,但我不认为这是干净或者(和它会带来其整套probelms的:零点可能不会被序列化,在construtor等会发生什么)。
有任何想法吗?
随着杰克逊,你可以反思任意类来获得可用的JSON属性:
// Construct a Jackson JavaType for your class
JavaType javaType = mapper.getTypeFactory().constructType(MyDto.class);
// Introspect the given type
BeanDescription beanDescription = mapper.getSerializationConfig().introspect(javaType);
// Find properties
List<BeanPropertyDefinition> properties = beanDescription.findProperties();
该BeanPropertyDefinition
列表应该给你你需要关于JSON属性的细节。
在@JsonIgnoreProperties
类级别的注释不考虑与上面提到的方法。但是你可以使用AnnotationIntrospector
获得忽略对类级属性:
// Get class level ignored properties
Set<String> ignoredProperties = mapper.getSerializationConfig().getAnnotationIntrospector()
.findPropertyIgnorals(beanDescription.getClassInfo()).getIgnored();
然后过滤properties
去除其中存在于属性ignoredProperties
:
// Filter properties removing the class level ignored ones
List<BeanPropertyDefinition> availableProperties = properties.stream()
.filter(property -> !ignoredProperties.contains(property.getName()))
.collect(Collectors.toList());
这种方法有效,即使你有你的类中定义的混合插件。
该AnnotationIntrospector#findPropertyIgnorals(Annotated)
方法是在杰克逊2.8推出。该AnnotationIntrospector#findPropertiesToIgnore(Annotated, boolean)
方法可用于旧版本(但自从杰克逊2.8它是不建议使用)。
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句