首页 > 解决方案 > Jackson 使用 getter 反序列化字段

问题描述

我有杰克逊这样设置。

objectMapper.setVisibility(PropertyAccessor.ALL, JsonAutoDetect.Visibility.NONE);
objectMapper.setVisibility(PropertyAccessor.FIELD, JsonAutoDetect.Visibility.ANY);

这样它只会序列化带有注释的字段和函数@JsonProperty,这正是我想要的。但是它用于java.lang.reflect.Field.get(bean)获取字段的值。

如果我可以让 Jackson 使用 getter 访问字段值,我会更喜欢它。

有什么办法可以使这成为可能吗?

更新

我调试了一下,发现

   public void serializeAsField(Object bean, JsonGenerator gen,
            SerializerProvider prov) throws Exception {
        // inlined 'get()'
        final Object value = (_accessorMethod == null) ? _field.get(bean)
                : _accessorMethod.invoke(bean, (Object[]) null);

BeanPropertyWriter. _accessorMethod顺便说一句是空的。

更新 2

这是我要序列化的类之一。

import lombok.Data;

@Data
public class JwtAuthenticationResponse{
    private final String token;
}

Getter 是使用 lombok 的 @Data Annotation 生成的。

更新 3

我进一步调试并最终得到一个POJOPropertiesCollector._removeUnwantedAccessor(props).

它删除了先前找到的访问器,因为它的可见性已用objectMapper.setVisibility(PropertyAccessor.ALL, JsonAutoDetect.Visibility.NONE);.

由于我使用的是 lombok,因此我不能在 getter 上使用任何 @Json*** 注释。这就是为什么我决定只使用字段来确定将被序列化的属性。但我一直想使用他们适当的 getter 作为值访问器。

有没有办法做到这一点?

标签: javajsonjackson

解决方案


推荐阅读