我需要从任何对象中的字符串类型的字段中去除所有特殊字符和控制字符。反序列化程序已注册,但从未在 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/