Java 可以优化我的自定义反序列化程序吗?

Java 可以优化我的自定义反序列化程序吗?,java,json,jackson,json-deserialization,Java,Json,Jackson,Json Deserialization,我创建了一个新的自定义反序列化程序,当json中存在空字符串时,该反序列化程序将作为null返回 public class CustomDeserializer extends JsonDeserializer<User> { @Override public User deserialize(JsonParser jsonParser, DeserializationContext context) throws IOException { JsonNode nod

我创建了一个新的自定义反序列化程序,当json中存在空字符串时,该反序列化程序将作为null返回

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扩展JsonDeserializer{
@凌驾
公共用户反序列化(JsonParser、JsonParser、反序列化上下文)抛出
IOException{
JsonNode节点=jsonParser.readValueAsTree();
字符串firstName=null;
字符串lastName=null;
字符串年龄=空;
字符串地址=空;
if(node.has(“firstName”)&&!node.get(“firstName”).astex().isEmpty()){
firstName=node.get(“firstName”).asText();
}
if(node.has(“lastName”)&&&!node.get(“lastName”).astex().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(“地址”).asText();
}
if(firstName==null&&lastName==null&&age==null&&address==null){
返回null;
}
返回新用户(名字、姓氏、年龄、地址);
}

我的问题是从性能的角度来看。我想优化在每一个可能的字段更改时都必须更改反序列化器的事实。是否可以优化您的反序列化器?我正在考虑使用Reflaction,但我不知道如何进行。这是可能的?

我建议另一种方法。 对于
用户
,不使用
自定义反序列化程序
, 我宁愿为
String
编写一个自定义反序列化程序。 然后,您可以对的字符串属性使用此反序列化器 您的
用户
类,您希望将空字符串视为null。 这也使您在需要时更易于维护 更改
用户
类的属性

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

你为什么要优化它?这是性能问题吗?还是你在考虑维护问题?@Ghokun maintenance,我不喜欢每次可能更改Json时都要更改反序列化程序fields@Jacket,请参阅[我提供的反序列化程序](())在你的回答中:它确实是基于反射的,我之所以在回答中包含它,就是为了给你一个比其他回答中提供的更合适、更可维护的反序列化器,而其他回答中提供的反序列化器更紧密地结合到一个特定的用例中。请参阅代码的更新版本,我认为它应该可以正常工作。