Jackson 是否可以配置为修剪所有字符串属性中的前导/尾随空格?
JSON 示例(请注意,字符串有尾随空格):
{ "aNumber": 0, "aString": "string " }
理想情况下,反序列化实例将具有值为 "string" 的 aString 属性(即没有尾随空格)。这似乎是可能受支持的东西,但我找不到它(例如在DeserializationConfig.Feature中)。
我们使用 Spring MVC 3.x,因此基于 Spring 的解决方案也可以。
我尝试根据论坛帖子中的建议配置Spring的WebDataBinder但使用 Jackson 消息转换器时它似乎不起作用:
@InitBinder
public void initBinder( WebDataBinder binder )
{
binder.registerCustomEditor( String.class, new StringTrimmerEditor( " \t\r\n\f", true ) );
}
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(7)
对于 Spring Boot 用户来说,这是一个简单的解决方案,只需将 walv 的 SimpleModule 扩展添加到您的应用程序上下文中即可:
http://docs.spring.io/spring-boot/docs/current/reference/html/howto-spring-mvc.html#howto-customize-the-jackson-objectmapper
如果您不使用弹簧boot,你必须自己注册StringTrimModule(不需要用@Component注解)
Easy solution for Spring Boot users, just add that walv's SimpleModule extension to your application context:
http://docs.spring.io/spring-boot/docs/current/reference/html/howto-spring-mvc.html#howto-customize-the-jackson-objectmapper
if you are not using spring boot, you have to register the StringTrimModule yourself (you do not need to annotate it with @Component)
使用 自定义反序列化器< /a>,您可以执行以下操作:
此解决方案确实意味着该 bean 属性将始终以这种方式序列化,并且您必须注释您想要的每个属性以这种方式反序列化。
With a custom deserializer, you could do the following:
This solution does imply that this bean attribute will always be serialized this way, and you will have to annotate every attribute that you want to be deserialized this way.
我认为最好扩展默认的 StringDeserializer,因为它已经处理了一些特定的情况(请参阅 此处 和 此处)可供第三方库使用。您可以在下面找到 Spring Boot 的配置。这仅适用于 Jackson 2.9.0 及更高版本,因为从 2.9.0 版本开始,StringDeserializer 不再是最终版本。如果您的 Jackson 版本低于 2.9.0,您仍然可以将 StringDeserializer 的内容复制到您的代码中以处理上述情况。
I think it is better to extend default StringDeserializer as it already handles some specific cases (see here and here) that can be used by third party libraries. Below you can find configuration for Spring Boot. This is possible only with Jackson 2.9.0 and above as starting from 2.9.0 version StringDeserializer is not final anymore. If you have Jackson version below 2.9.0 you can still copy content of StringDeserializer to your code to handle above mentioned cases.
注解@JsonDeserialize的问题是你必须始终记住将它放在setter上。
为了使用 Spring MVC 使其在全局范围内“一劳永逸”,我执行了以下步骤:
pom.xml:
创建自定义 ObjectMapper:
更新 Spring 的 servlet-context.xml:
The problem of annotation @JsonDeserialize is that you must always remember to put it on the setter.
To make it globally "once and forever" with Spring MVC, I did next steps:
pom.xml:
Create custom ObjectMapper:
Update Spring's servlet-context.xml:
对于 Spring Boot,我们只需创建一个自定义反序列化器,如 记录在手册中。
以下是我的 Groovy 代码,但您可以随意调整它以使其在 Java 中工作。
For Spring Boot, we just have to create a custom deserializer as documented in the manual.
The following is my Groovy code but feel free to adapt it to work in Java.
com.fasterxml.jackson.dataformat
pom.xml
CsvUtil.java
com.fasterxml.jackson.dataformat
pom.xml
CsvUtil.java
我建议您执行以下操作:
首先,创建一个模块来修剪并将其放入一个类中:
然后,创建一个类来配置 jackson 并添加该模块:
就是这样。
I propose you the following:
First, create a module to trim and put it into a class:
Then, create a class to configure jackson and add the module:
That's it.