【问题标题】:How to force Jackson deserialize field values to lower case如何强制杰克逊将字段值反序列化为小写
【发布时间】:2018-02-01 09:20:10
【问题描述】:

我有暴露 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

感谢 Jackson 的解决方案。

【问题讨论】:

  • 只是一个建议,没有测试它,但也许为Person类编写一个构造函数来存储小写的值?
  • 你在用spring data rest吗?

标签: spring jackson deserialization


【解决方案1】:

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

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;
    }
}

【讨论】:

    【解决方案2】:

    简答在setter中调用toLower

    这是一个例子:

    class Animal
    {
        private String name;
    
        public void setName(final String newValue)
        {
            StringUtils.trimToNull(StringUtils.lowerCase(newValue));
        }
    }
    

    我还推荐trimToNUlltrimToEmpty

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2013-07-10
      • 2013-04-09
      • 1970-01-01
      • 2020-10-06
      • 1970-01-01
      • 2015-08-01
      • 2013-02-23
      相关资源
      最近更新 更多