如何获取 Jackson 查看的类的属性列表?

2022-09-03 05:09:53

我正在编写需要访问 Jackson 配置定义的类的属性列表的代码。

例如,对于以下类:

@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 并检查 Jackson 注释是要走的路,因为这将重新实现 Jackson。

如果我能够获得用于序列化的 Jackson ObjectMapper 的句柄,有没有办法获取类的属性列表<>Type 对象?(尊重杰克逊的注释和配置)

我对 Jackson 的实现进行了一些深入研究,并找到了 ,但我不确定如何从 Jackson 外部使用它(我相信我们不应该这样做)。POJOPropertiesCollector

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

有什么想法吗?


答案 1

使用 Jackson,您可以内省任意类以获取可用的 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();

然后过滤删除存在于中的属性:propertiesignoredProperties

// 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)方法在Jackson 2.8中引入。AnnotationIntrospector#findPropertiesToIgnore(Annotated, boolean) 方法可用于旧版本(但自 Jackson 2.8 以来已弃用)。


答案 2