Java 可以优化我的自定义反序列化程序吗?
我创建了一个新的自定义反序列化程序,当json中存在空字符串时,该反序列化程序将作为null返回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
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,请参阅[我提供的反序列化程序](())在你的回答中:它确实是基于反射的,我之所以在回答中包含它,就是为了给你一个比其他回答中提供的更合适、更可维护的反序列化器,而其他回答中提供的反序列化器更紧密地结合到一个特定的用例中。请参阅代码的更新版本,我认为它应该可以正常工作。