java - Spring JsonDeserializer 不适用于 String 类型

标签 java spring string jackson json-deserialization

我需要从任何对象中的字符串类型的字段中去除所有特殊字符和控制字符。反序列化程序已注册,但从未在 Strings 的运行时执行。 我尝试添加与注释相同的内容 @JsonDeserialize(using = StringProcessorComponent.class),但同样的问题。 它适用于任何其他类型,例如 Date/Long。如果我遗漏了任何内容,请告诉我。

这是我的反序列化器。

@JsonComponent
public class StringProcessorComponent extends JsonDeserializer<String> {
    @Override
    public String deserialize(JsonParser p, DeserializationContext ctxt) throws IOException {
        JsonToken currentToken = p.getCurrentToken();

        if (currentToken.equals(JsonToken.VALUE_STRING)) {
            String text = MyStringProcessor.clean(p.getValueAsString());
            return text;
        }

        return null;
    }
}

最佳答案

要覆盖默认反序列化器,您可以使用 SimpleModule。此外,如果可能的话,当你想扩展默认实现时,你可以扩展默认反序列化器。在您的情况下,您可以扩展 com.fasterxml.jackson.databind.deser.std.StringDeserializer 类。请参见以下示例:

import com.fasterxml.jackson.core.JsonParser;
import com.fasterxml.jackson.databind.DeserializationContext;
import com.fasterxml.jackson.databind.ObjectMapper;
import com.fasterxml.jackson.databind.deser.std.StringDeserializer;
import com.fasterxml.jackson.databind.module.SimpleModule;

import java.io.IOException;
import java.util.StringJoiner;

public class JsonApp {

    public static void main(String[] args) throws Exception {
        SimpleModule stringModule = new SimpleModule("String Module");
        stringModule.addDeserializer(String.class, new CustomStringDeserializer());

        ObjectMapper mapper = new ObjectMapper();
        mapper.registerModule(stringModule);

        String json = "{\"firstName\":\"  Tom \",\"lastName\":\"  Long \"}";

        CustomStringPojo customStringPojo = mapper.readValue(json, CustomStringPojo.class);
        System.out.println(customStringPojo);
    }
}

class CustomStringDeserializer extends StringDeserializer {
    @Override
    public String deserialize(JsonParser p, DeserializationContext ctxt) throws IOException {
        String text = super.deserialize(p, ctxt);
        //clean up value
        return text.trim();
    }
}

class CustomStringPojo {
    private String firstName;
    private String lastName;

    // getters, setters, toString
}

以上代码打印:

CustomStringPojo{firstName='Tom', lastName='Long'}

关于java - Spring JsonDeserializer 不适用于 String 类型,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60724970/

相关文章:

java - 当响应不包含 header 信息时如何解析json响应

Java私有(private)静态内部类

Spring Security - 如何使用数据库动态定义拦截 url?

java - Spring 动态表单的更好方法?

java - Thymeleaf 中的 View 和重定向有什么区别?

c - linux中strtok定义的位置

javascript 正则表达式修复不替换图像 url

java - CommonPool 而非自定义池中的 ParallelStream 队列任务

JavaScript - 拆分,选择给定数字后的所有内容

java - 如何从多个类扩展状态