如何强制Jackson将字段值反序列化为小写

时间:2017-08-23 17:04:21

标签: spring jackson deserialization

我有暴露REST端点的spring应用程序,让它命名为“doAction”。作为请求它消耗对象:

class Person{
private String name;
private String email;
}

有些客户可以通过不同的写单词实践来传递数据,如:

Peter_1
name = Peter 
email = peter@gmail.com  (lower case)

Mark_2
name = mark
email = MARK@gmail.com (upper case)

Julia_3
name = julia
email = JuliaToward@gmail.com (camel case)

是否有一些方法可以将所有收入数据强制解析为小写(假设所有字段都是字符串)?

因此我希望得到:

Peter_1
name = peter 
email = peter@gmail.com

Mark_2
name = mark
email = mark@gmail.com

Julia_3
name = julia
email = juliatoward@gmail.com

对杰克逊的解决方案表示赞赏。

2 个答案:

答案 0 :(得分:1)

简短回答在setter中调用toLower

以下是一个例子:

class Animal
{
    private String name;

    public void setName(final String newValue)
    {
        StringUtils.trimToNull(StringUtils.lowerCase(newValue));
    }
}

我还建议使用trimToNUlltrimToEmpty

答案 1 :(得分:0)

如果您正在使用带有spring mvc的Spring Data Rest并且您希望所有传入的字符串数据都是小写的,那么请定义以下

public class StringSerializer extends StdDeserializer<String>{

    public StringSerializer() {
        this(null);
    }

    public StringSerializer(Class<String> vc) {
        super(vc);
    }

    @Override
    public String deserialize(JsonParser p, DeserializationContext ctxt) throws IOException, JsonProcessingException {
        JsonToken t = p.getCurrentToken();
        if (t==JsonToken.VALUE_STRING){
            String receivedValue = p.getText();
            if (receivedValue == null)
                return null;
            else
                return receivedValue.toLowerCase();
        }else{
            return null;
        }   
    }

}

以下:

@Configuration
public class RestDataConfig  extends RepositoryRestMvcConfiguration {

    @Override
    @Bean
    public ObjectMapper halObjectMapper() {

        ObjectMapper mapper = super.halObjectMapper();
        SimpleModule module = new SimpleModule();
        module.addDeserializer(String.class, new StringSerializer());
        mapper.registerModule(module);
        return mapper;
    }
}