Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Can Jackson be configured to trim leading/trailing whitespace from all string properties?

Example JSON (note that the string has trailing spaces):

{ "aNumber": 0, "aString": "string   " } 

Ideally, the deserialised instance would have an aString property with a value of "string" (i.e. without trailing spaces). This seems like something that is probably supported but I can't find it (e.g. in DeserializationConfig.Feature).

We're using Spring MVC 3.x so a Spring-based solution would also be fine.

I tried configuring Spring's WebDataBinder based on a suggestion in a forum post but it does not seem to work when using a Jackson message converter:

@InitBinder public void initBinder( WebDataBinder binder ) {     binder.registerCustomEditor( String.class, new StringTrimmerEditor( " \t\r\n\f", true ) ); } 
like image 600
penfold Avatar asked Jul 27 '11 22:07

penfold


People also ask

How do you cut leading and trailing spaces from a string?

To remove leading and trailing spaces in Java, use the trim() method. This method returns a copy of this string with leading and trailing white space removed, or this string if it has no leading or trailing white space.

Which function is used to remove all leading and trailing whitespace from the string?

You can use the STRIP function to remove both the leading and trailing spaces from the character strings.

Which method is used to remove leading and trailing?

Use the Trim() method to remove leading and trailing whitespace from a string.

What is leading and trailing whitespace?

A leading space is a space that is located before the first character (letter, number, punctuation mark) in a text entry field. A trailing space is a space that is located after the final character in a text entry field.


1 Answers

Easy solution for Spring Boot users, just add that walv's SimpleModule extension to your application context:

package com.example;  import com.fasterxml.jackson.core.JsonParser; import com.fasterxml.jackson.core.JsonProcessingException; import com.fasterxml.jackson.databind.DeserializationContext; import com.fasterxml.jackson.databind.deser.std.StdScalarDeserializer; import com.fasterxml.jackson.databind.module.SimpleModule; import org.springframework.stereotype.Component;  import java.io.IOException;  @Component public class StringTrimModule extends SimpleModule {      public StringTrimModule() {         addDeserializer(String.class, new StdScalarDeserializer<String>(String.class) {             @Override             public String deserialize(JsonParser jsonParser, DeserializationContext ctx) throws IOException,                     JsonProcessingException {                 return jsonParser.getValueAsString().trim();             }         });     } } 

Another way to customize Jackson is to add beans of type com.fasterxml.jackson.databind.Module to your context. They will be registered with every bean of type ObjectMapper, providing a global mechanism for contributing custom modules when you add new features to your application.

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)

<bean class="org.springframework.http.converter.json.Jackson2Objec‌​tMapperFactoryBean">     <property name="modulesToInstall" value="com.example.StringTrimModule"/> </bean 
like image 133
Maciej Marczuk Avatar answered Sep 21 '22 12:09

Maciej Marczuk