是否可以优化我的自定义解串器?

问题描述

我创建了一个新的自定义反序列化器,当 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;
    }
}