jackson 在Sping Boot 中将JSON字段反串行化为小写

r6vfmomb  于 2022-11-08  发布在  其他
关注(0)|答案(3)|浏览(179)

我有一个-

@RestController
public class UserController {

   @PostMapping
   @ResponseStatus(CREATED)
   public UserResponse register( @Valid @RequestBody UserRequest userRequest) {
     //return ....
   } 
}

下面是UserRequest.java

@Data
@NoArgsConstructor
@AllArgsConstructor
@Builder
public class UserRequest {

    private String email;
    //other property
}

我在请求正文中发送下面的json-

{
   "email" : "TEST@Example.com",
   //some other fields.
 }

有时客户端会以大写或camel形式发送email,因此在userRquest中,我希望在反序列化为UserRequest对象时将email字段的值更改为小写,如test@example.com
有什么简单的方法可以做到这一点吗?我可以介绍一下我自己的annotation吗?比如@ToLowerCase,我如何创建自己的注解,并在UserRequest中的字段级别使用它。

i7uq4tfw

i7uq4tfw1#

引入一个新的注解@ToLowerCase并不是一个简单的方法,因为这样还需要实现一些注解处理器来完成真实的的转换工作。
但是你可以用一种稍微不同的方法来实现你的目标。在你的UserRequest类中用@JsonDeserialize注解email属性,并在那里指定一个converter

@JsonDeserialize(converter = ToLowerCaseConverter.class)
private String email;

您需要自己实现转换器类,但通过从StdConverter扩展它就很容易了。

public class ToLowerCaseConverter extends StdConverter<String, String> {

    @Override
    public String convert(String value) {
        return value.toLowerCase();
    }
}
nkkqxpd9

nkkqxpd92#

Jackson将在你的类中使用setter方法。在setter中执行到小写的转换。
比如说

public void setEmail(String newValue)
{
    email = StringUtils.lowerCase(newValue);
}

StringUtils是一个Apache公用类。

thtygnil

thtygnil3#

您可以创建一个通用的StringDeserializer,并将其注册到ObjectMapper中,如下所示:-

字符串反序列化程序类

public final class StringDeserializer extends StdDeserializer<String> {

    public StringDeserializer() {
        super((Class<String>) null);
    }

    @Override
    public String deserialize(JsonParser parser, DeserializationContext context) throws IOException {
        JsonToken token = parser.getCurrentToken();

        if (token == JsonToken.VALUE_STRING) {
            String text = parser.getText();
            return text == null ? null : text.toLowerCase().trim();
        }

        return null;
    }
}

Jackson配置类

@Configuration
public class JacksonConfiguration {

    @Autowired
    void mapper(ObjectMapper mapper) {
        mapper.registerModule(initModule());
    }

    private Module initModule() {
        SimpleModule module = new SimpleModule();
        module.addDeserializer(String.class, new StringDeserializer());
        return module;
    }
}

上面的代码使Jackson将所有字符串反序列化为小写并进行修剪。

相关问题