gpt4 book ai didi

java - 如何获取 Jackson 认为的类的属性列表?

转载 作者:搜寻专家 更新时间:2023-11-01 01:15:40 28 4
gpt4 key购买 nike

我正在编写需要访问由 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]因为这是 Jackson 在序列化时实际考虑的属性。

我不认为编写一整段代码来查找 getter/setter 并检查 Jackson 注释是可行的方法,因为那样会重新实现 Jackson。

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

我深入研究了 Jackson 的实现,发现了 POJOPropertiesCollector ,但我不确定如何从 Jackson 外部使用它(我相信我们不应该这样做)。

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

有什么想法吗?

最佳答案

有了 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());

即使您为您的类定义了混入,这种方法仍然有效。


AnnotationIntrospector#findPropertyIgnorals(Annotated)方法是在 Jackson 2.8 中引入的。 AnnotationIntrospector#findPropertiesToIgnore(Annotated, boolean)方法可用于旧版本(但自 Jackson 2.8 起已弃用)。

关于java - 如何获取 Jackson 认为的类的属性列表?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45834654/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com