我正在编写需要访问Jackson配置定义的类属性列表的代码。
例如,对于以下类:
Match Case
我会得到@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
}
,因为这是杰克逊在序列化时实际考虑的属性。
我不认为编写一整段代码来寻找getter / setter并检查Jackson注释是要走的路,因为这将重新实现Jackson。
如果我能够处理用于序列化的杰克逊[name,longValue]
,是否有办法获取ObjectMapper
或Class<?>
的属性列表对象?(尊重杰克逊注释和配置)
我挖了一下杰克逊的实施,发现了Type
,但我不确定如何从杰克逊以外的地方使用它(我相信我们不应该这样做)。
作为最后的手段,我可以创建我正在检查的类的实例,使用ObjectMapper对其进行序列化,然后解析JSON以查找属性名称,但我认为这也不干净(并且它会带来一整套的问题:nulls可能没有序列化,construtor会发生什么等等。)。
有什么想法吗?
答案 0 :(得分:9)
使用Jackson,您可以introspect an arbitrary class获取可用的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());
即使您为班级定义了混音,此方法仍然有效。
杰克逊2.8中引入了AnnotationIntrospector#findPropertyIgnorals(Annotated)
方法。 AnnotationIntrospector#findPropertiesToIgnore(Annotated, boolean)
方法可用于旧版本(但自Jackson 2.8以来已弃用)。