当前位置: 首页 > 面试题库 >

在Jackson看来,如何获取类的属性列表?

屠锐
2023-03-14
问题内容

我正在编写需要访问由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。

如果我能够获得ObjectMapper用于序列化的Jackson的句柄,是否可以获取a
Class<?>Type对象的属性列表?
(尊重杰克逊的注释和配置)

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

作为最后的选择,我可以创建要检查的类的实例,使用ObjectMapper对其进行序列化,然后解析JSON以查找属性名称,但是我也不认为这很干净(并且这样做会带来完整的探针集:null可能不会序列化,构造器中会发生什么等)。

有任何想法吗?


问题答案:

使用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();

然后过滤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起已弃用)。



 类似资料:
  • 问题内容: 我想序列化一个不受我控制的POJO类,但是想避免序列化任何来自超类而不是最终类的属性。例: 您可以从示例中猜测到,该类是由JOOQ生成的,并且是从复杂的基类UpdatableRecordImpl继承的,该基类还具有一些类似于bean属性的方法,这会在序列化过程中引起问题。另外,我有几个类似的类,因此最好避免对所有生成的POJO复制相同的解决方案。 到目前为止,我已经找到以下可能的解决方

  • > 使用mixin技术忽略来自超类的特定字段,如下所示:我如何告诉jackson忽略一个我无法控制源代码的属性? 这样做的问题是,如果基类发生了变化(例如,其中出现了一个新的getAnything()方法),它可能会破坏我的实现。 实现一个自定义序列化程序并在那里处理问题。这在我看来有点矫枉过正。 但是,从纯设计的角度来看,最好的方法是告诉jackson我只想序列化最终类的属性,而忽略所有继承的属

  • 我需要标签中的属性值。< br >例如。Name xmlns:xsi = " http://www . w3 . org/2001/XML inst " xsi:space schema = " Name _ 5879 . xsd "

  • 我有一个类的列表,它具有以下属性: 现在,我想按(字符串)对列表进行分组,并获得的总和,该总和将成为每个的新。 因为我使用的是Java 8,所以应该是应该走的路。 Groupby应该使用以下代码非常简单: 如果我想通过SmartNo分组并在SettlementAmount上求和后获得一个新列表,该怎么办?这里的大多数例子只展示了如何打印出总和。我感兴趣的是如何获得聚合列表?

  • 我想设计一个这样的 TS 类型,但是不知道该如何设计,就是一个数组类型,数组的每一项都是一个对象,对象有两个属性,第一个属性是 就像这样使用React 组件,第二个对象是需要传递给该组件的属性,希望可以保持有 TS 的类型检查应该如何设计, 使用时就像这样 之前这么设计过这个类型,数组中只传入一项没有问题,但是假如传入多项就会有类型不匹配

  • 问题内容: 我正在使用Jackson 2.22序列化一些现有对象,利用MixIn功能将实际对象与Jackson批注配置分离。 实际上,我的mixin是一个接口,该接口声明目标类的相同方法并对其进行注释,这是一个示例。 目标类别: 和mixin: 我的JSON应该具有更多信息,这些信息是根据目标类的几种方法或字段计算得出的。 杰克逊有可能吗? 我尝试在类中打开mixin并在其中添加新方法,但这没有用