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

Jof*_*rey 4 java properties jackson

我正在编写需要访问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
}
Run Code Online (Sandbox Code Playgroud)

我会得到[name,longValue]因为这是杰克逊在序列化时实际考虑的属性.

我不认为编写一整段代码来寻找getter/setter并检查Jackson注释是要走的路,因为这将重新实现Jackson.

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

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

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

有任何想法吗?

cas*_*lin 12

使用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();
Run Code Online (Sandbox Code Playgroud)

BeanPropertyDefinition列表应该为您提供有关JSON属性的详细信息.


使用@JsonIgnoreProperties上述方法不考虑类级别注释.但是您可以使用a AnnotationIntrospector来在类级别上忽略属性:

// Get class level ignored properties
Set<String> ignoredProperties = mapper.getSerializationConfig().getAnnotationIntrospector()
        .findPropertyIgnorals(beanDescription.getClassInfo()).getIgnored();
Run Code Online (Sandbox Code Playgroud)

然后过滤properties删除以下属性ignoredProperties:

// Filter properties removing the class level ignored ones
List<BeanPropertyDefinition> availableProperties = properties.stream()
        .filter(property -> !ignoredProperties.contains(property.getName()))
        .collect(Collectors.toList());
Run Code Online (Sandbox Code Playgroud)

即使您为班级定义了混音,这种方法仍然有效.


AnnotationIntrospector#findPropertyIgnorals(Annotated)方法在Jackson 2.8中引入.该AnnotationIntrospector#findPropertiesToIgnore(Annotated, boolean)方法可用于旧版本(但自Jackson 2.8以来已弃用).

  • 感谢您的更新,这实际上与我在进一步挖掘之后所做的事情接近。对不起,您还没有发布它。为了将来参考,这是我的完整实现:​​https://github.com/joffrey-bion/livedoc/blob/master/livedoc-springmvc/src/main/java/org/hildan/livedoc/springmvc/scanner/properties/ JacksonPropertyScanner.java (2认同)
  • @BenBarden问题的前提是我已经可以访问“ObjectMapper”,因此无需解释如何获取它 (2认同)
  • @BenBarden 虽然我在一般情况下同意你的观点,但我认为这不适用于这里。ObjectMapper 是 Jackson 库的入口点。因此,如果一个人与 Jackson 交互,这通常是通过 ObjectMapper 进行的。如果没有,获取 ObjectMapper 的方式将是特定于框架的(例如在 Spring 的上下文中,可能是通过注入相关 bean)。因此,除了表示从某处获取 ObjectMapper 的通用注释之外,我们实际上无法在此处添加任何内容。从特定框架中获取它的方式将是单独问答的对象。 (2认同)