如何指定jackson只使用字段 - 最好是全局的。

11 浏览
0 Comments

如何指定jackson只使用字段 - 最好是全局的。

默认的Jackson行为似乎同时使用属性(getter和setter)和字段来进行JSON的序列化和反序列化。

我希望使用字段作为序列化配置的主要来源,因此不希望Jackson查看属性。

我可以通过注解在单个类上实现这一点:

 @JsonAutoDetect(fieldVisibility = Visibility.ANY, getterVisibility = Visibility.NONE, setterVisibility = Visibility.NONE)

但我不想在每个类上都加上这个注解...

是否可以全局配置这个?比如在Object Mapper中添加一些配置?

0
0 Comments

问题的原因是在使用jackson时,无法通过设置fieldVisibility、getterVisibility和setterVisibility来实现只使用字段的需求。解决方法是设置isGetterVisibility为Visibility.NONE。

具体来说,为了解决Boolean Getter/Setter的问题,需要进行如下设置:

isGetterVisibility = Visibility.NONE
setVisibility(PropertyAccessor.IS_GETTER, JsonAutoDetect.Visibility.NONE)

在使用spring-boot时,可以通过配置文件进行设置:

jackson:

visibility.field: any

visibility.getter: none

visibility.setter: none

visibility.is-getter: none

具体如何应用简单解决方案到bean类中可以参考上述代码。

0
0 Comments

问题的出现原因是用户在使用Jackson 1.9.0 jar时,在将对象序列化为JSON字符串时,会得到额外的JSON属性。用户希望得到只包含指定变量的JSON字符串。

解决方法是使用Jackson 2.0及更高版本提供的功能。用户可以使用以下代码片段来关闭自动检测并只使用字段:

import com.fasterxml.jackson.annotation.JsonAutoDetect;
import com.fasterxml.jackson.annotation.PropertyAccessor;
import com.fasterxml.jackson.databind.ObjectMapper;   
...
ObjectMapper mapper = new ObjectMapper();    
mapper.setVisibility(PropertyAccessor.ALL, Visibility.NONE);
mapper.setVisibility(PropertyAccessor.FIELD, Visibility.ANY);

此外,用户还可以通过在类注释中添加`fieldVisibility = Visibility.NONE, getterVisibility = Visibility.NONE, setterVisibility = Visibility.NONE`来指定只包含指定属性。

对于在后续版本中查找替换类名的最佳方法,用户表示这可能是困难和棘手的,因为在搜索"JsonMethod"时很少能得到指向"PropertyAccessor"的链接。

总结起来,用户可以使用Jackson 2.0及更高版本中提供的`setVisibility`方法来关闭自动检测并只使用字段,也可以通过添加类注释和属性注释来指定只包含指定属性。在查找替换类名时可能会遇到一些困难。

0
0 Comments

问题的出现原因是需要将Jackson配置为仅使用字段,最好是全局范围内。然而,通过查阅文档和尝试,发现配置ObjectMapper只能针对个别的ObjectMapper进行设置。解决方法是通过访问一个已配置的mapper的包装类来实现全局设置。以下是具体的解决方法:

首先,创建一个ObjectMapper对象并设置其可见性:

ObjectMapper mapper  = new ObjectMapper();
mapper.setVisibility(mapper.getSerializationConfig().getDefaultVisibilityChecker()
                .withFieldVisibility(JsonAutoDetect.Visibility.ANY)
                .withGetterVisibility(JsonAutoDetect.Visibility.NONE)
                .withSetterVisibility(JsonAutoDetect.Visibility.NONE)
                .withCreatorVisibility(JsonAutoDetect.Visibility.NONE));

如果想要全局设置,可以通过访问一个已配置的mapper来实现。可以通过设置可见性检查器来实现:

mapper.setVisibilityChecker(mapper.getVisibilityChecker().with...);

需要注意的是,`withGetterVisibility`方法并不能覆盖`is*`方法,但是可以使用`withIsGetterVisibility`方法来处理它们。

另外,需要注意的是,`setVisibilityChecker`方法已经被弃用,应该使用`setVisibility`方法代替。

最后,通过这种配置,可以使用一个Mixin来方便地将Hibernate实体转换为DTO。默认情况下,ObjectMapper会序列化所有内容,而使用Mixin可以指定要忽略的属性。

这个配置对我非常有用!感谢提供这个解决方案的评论。

整理后的文章如下:

问题:如何指定Jackson仅使用字段,最好是全局范围内?

解决方法:可以通过配置ObjectMapper对象的可见性来实现。但是,Jackson只允许针对个别的ObjectMapper进行设置。为了实现全局设置,可以通过访问一个已配置的mapper来实现。具体的配置方法如下:

首先,创建一个ObjectMapper对象并设置其可见性:

ObjectMapper mapper  = new ObjectMapper();
mapper.setVisibility(mapper.getSerializationConfig().getDefaultVisibilityChecker()
                .withFieldVisibility(JsonAutoDetect.Visibility.ANY)
                .withGetterVisibility(JsonAutoDetect.Visibility.NONE)
                .withSetterVisibility(JsonAutoDetect.Visibility.NONE)
                .withCreatorVisibility(JsonAutoDetect.Visibility.NONE));

如果想要全局设置,可以通过访问一个已配置的mapper来实现。可以通过设置可见性检查器来实现:

mapper.setVisibilityChecker(mapper.getVisibilityChecker().with...);

需要注意的是,`withGetterVisibility`方法并不能覆盖`is*`方法,但是可以使用`withIsGetterVisibility`方法来处理它们。

另外,需要注意的是,`setVisibilityChecker`方法已经被弃用,应该使用`setVisibility`方法代替。

最后,通过这种配置,可以使用一个Mixin来方便地将Hibernate实体转换为DTO。默认情况下,ObjectMapper会序列化所有内容,而使用Mixin可以指定要忽略的属性。

这个配置对我非常有用!感谢提供这个解决方案的评论。

0