如何获取杰克逊观看的类的属性列表?

时间:2017-08-23 08:35:24

标签: java properties jackson

我正在编写需要访问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],是否有办法获取ObjectMapperClass<?>的属性列表对象?(尊重杰克逊注释和配置)

我挖了一下杰克逊的实施,发现了Type,但我不确定如何从杰克逊以外的地方使用它(我相信我们不应该这样做)。

作为最后的手段,我可​​以创建我正在检查的类的实例,使用ObjectMapper对其进行序列化,然后解析JSON以查找属性名称,但我认为这也不干净(并且它会带来一整套的问题:nulls可能没有序列化,construtor会发生什么等等。)。

有什么想法吗?

1 个答案:

答案 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以来已弃用)。