问题描述
我创建了一个新的自定义反序列化器,当 json 中存在空字符串时,它将作为空字符串返回
public class CustomDeserializer extends JsonDeserializer<User> {
@Override
public User deserialize(JsonParser jsonParser,DeserializationContext context) throws
IOException {
JsonNode node = jsonParser.readValueAsTree();
String firstName = null;
String lastName = null;
String age = null;
String address = null;
if(node.has("firstName") && !node.get("firstName").asText().isEmpty()) {
firstName = node.get("firstName").asText();
}
if(node.has("lastName") && !node.get("lastName").asText().isEmpty()) {
lastName = node.get("lastName").asText();
}
if(node.has("age") && !node.get("age").asText().isEmpty()) {
age = node.get("age").asText();
}
if(node.has("address") && !node.get("address").asText().isEmpty()) {
address = node.get("address").asText();
}
if(firstName == null && lastName == null && age == null && address == null) {
return null;
}
return new User(firstName,lastName,age,address);
}
我的问题是从性能的角度来看。我想优化在每次可能的字段更改时都必须更改解串器的事实。可以优化你的吗?我正在考虑使用反射,但我不知道如何去做。有可能吗?
解决方法
我会建议另一种方法。
而不是对 CustomDeserializer
使用 User
,
我宁愿为 String
编写一个自定义反序列化器。
然后你可以使用这个反序列化器的字符串属性
您的 User
类,您希望将空字符串视为空字符串。
这也使您在需要时更容易维护
更改 User
类的属性。
public class User {
@JsonDeserialize(using = CustomStringDeserializer.class)
private String firstName;
@JsonDeserialize(using = CustomStringDeserializer.class)
private String lastName;
@JsonDeserialize(using = CustomStringDeserializer.class)
private String age;
@JsonDeserialize(using = CustomStringDeserializer.class)
private String address;
// getters and setters omitted here for brevity
}
自定义字符串解串器可以很容易地实现
通过扩展 Jackson 的 StringDeserializer
。
public class CustomStringDeserializer extends StringDeserializer {
@Override
public String deserialize(JsonParser p,DeserializationContext ctxt) throws IOException {
String value = super.deserialize(p,ctxt);
if (value != null && value.isEmpty())
value = null; // replace empty string by null
return value;
}
}