示例JSON(注意字符串有尾随空格):
{ "aNumber": 0, "aString": "string " }
理想情况下,反序列化的示例应该有一个值为**“string”的aString**属性(即没有尾随空格)。这似乎是可能支持的东西,但我找不到它(例如在 DeserializationConfig.Feature 中)。
我们使用的是Spring MVC 3.x,因此基于Spring的解决方案也可以。
我尝试根据forum post中的建议配置Spring的WebDataBinder,但在使用Jackson消息转换器时似乎不起作用:
@InitBinder
public void initBinder( WebDataBinder binder )
{
binder.registerCustomEditor( String.class, new StringTrimmerEditor( " \t\r\n\f", true ) );
}
7条答案
按热度按时间lhcgjxsq1#
对于Sping Boot 用户来说,这是一个简单的解决方案,只需将walv的SimpleModule扩展添加到您的应用程序上下文中:
定制Jackson的另一种方法是将类型为com.fasterxml.jackson.databind.Module的bean添加到上下文中。它们将注册到每个类型为ObjectMapper的bean中,从而在向应用程序添加新特性时提供一种全局机制来提供定制模块。
http://docs.spring.io/spring-boot/docs/current/reference/html/howto-spring-mvc.html#howto-customize-the-jackson-objectmapper
如果您不使用 Spring Boot ,您必须自己注册StringTrimModule(您不需要使用@Component对其进行注解)
vwkv1x7d2#
使用custom deserializer,您可以执行以下操作:
此解决方案确实意味着此Bean属性将始终以这种方式序列化,并且您必须对希望以这种方式反序列化的每个属性进行注解。
3gtaxfhh3#
我认为最好扩展默认StringDeserializer,因为它已经处理了一些特定情况(请参阅此处和此处),可供第三方库使用。下面您可以找到Sping Boot 的配置。这仅适用于Jackson2.9.0及以上版本,因为从2.9.0版本开始StringDeserializer不再是最终版本。如果您有Jackson 2.9以下版本。0时,您仍然可以将StringDeserializer的内容复制到您的代码中,以处理上述情况。
uklbhaso4#
注解@JsonDeserialize的问题是你必须始终记住把它放在setter上。为了用SpringMVC使它全局“一劳永逸”,我做了下面的步骤:
pom.xml:
创建自定义ObjectMapper:
更新Spring的servlet-context.xml:
zvms9eto5#
对于 Boot ,我们只需要创建一个自定义的反序列化器,如手册中所述。
下面是我的Groovy代码,但您可以随意修改它以在Java中工作。
niwlg2el6#
com.fasterxml.jackson.dataformat
pom.xml
CsvUtil.java
qnyhuwrf7#
我向你提出以下建议:
首先,创建一个要修剪的模块,并将其放入类中:
然后,创建一个类来配置Jackson并添加模块:
就这样了