如何获得一个类,杰克逊的看法它的属性列表?

乔佛里:

我在写代码由杰克逊的结构定义需要访问类的属性列表。

例如,对于下面这个类:

@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方法,检查杰克逊注解是要走的路,因为这将被重新实现杰克逊。

如果我能得到杰克逊的手柄ObjectMapper用于序列化,是有办法得到的属性列表Class<?>Type对象?(尊重杰克逊注释和CONFIG)

我挖了一下到杰克逊的实施,并找到了POJOPropertiesCollector,但我不知道我该如何使用它从外部杰克逊(我们不应该这样做,我相信)。

作为最后的手段,我可​​以创建我检查类的一个实例,与ObjectMapper序列化,然后解析JSON找到属性名称,但我不认为这是干净或者(和它会带来其整套probelms的:零点可能不会被序列化,在construtor等会发生什么)。

有任何想法吗?

cassiomolin:

随着杰克逊,你可以反思任意类来获得可用的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)方法是在杰克逊2.8推出。AnnotationIntrospector#findPropertiesToIgnore(Annotated, boolean)方法可用于旧版本(但自从杰克逊2.8它是不建议使用)。

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

如何序列化一个列表的内容与杰克逊平坦JSON对象?

杰克逊的平面 JSON 用于一个字段的类/记录

杰克逊序列化简单的一个属性ValueObject像枚举-不嵌套

杰克逊(Jackson):杰森(Json)具有到Java类的json数组,该数组具有另一个Java类的列表

如何声明另一个杰克逊ObjectMapper不影响原豆的“客户”?

如何将几个参数移动到杰克逊的另一个节点?

从杰克逊的一个对象到另一个对象的属性的深层复制?

杰克逊忽略特定的属性,但能检查是它availble的

如何分析领域可能是一个字符串,并且可以与杰克逊的数组

使用杰克逊进行序列化时合并两个类的属性

如何获得JSON的一部分,作为杰克逊使用纯文本

当杰克逊为空列表时不返回属性

杰克逊(Jackson):当类名更改并且类从另一个类继承时,序列化应该更改吗?

如何解开杰克逊列表包裹项目列表?

捕获和处理异常杰克逊用一个自定义消息

杰克逊解串器委托给一个适用的解串器

解析JSON使用杰克逊:我们可以在一个POJO可选变量

映射一个JSON字符串与杰克逊对象将抛出MismatchedInputException

杰克逊-反序列化一个基本枚举

杰克逊在春季启动错误序列化一个ZonedDateTime

传递一个手动的内容创建的JSONObject杰克逊

杰克逊:如果有多个串行器,则使用哪一个?

杰克逊默认解析为一个子类

杰克逊无法使用一个参数构造器构造实例

杰克逊-在数组中获取一个条目

使用杰克逊从json数组中检索一个值

杰克逊坚持要映射一个未知的财产

杰克逊在同一个POJO中映射不同的展开元素

杰克逊反电子化:根源上的两个关键。我如何解开一个而忽略另一个?