我创建了一个新的自定义反序列化程序,当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);
}
我的问题是从性能的角度来看的。我想优化一个事实,即在字段的每一个可能的更改中都必须更改反序列化器。有可能优化你的吗?我正在考虑使用Reflaction,但我不知道怎么做。有可能吗?
我建议另一种方法。我宁愿为字符串
编写自定义反序列化程序,而不是为用户
使用自定义反序列化程序
。然后,您可以对用户
类的字符串属性使用此反序列化器,您希望将空字符串视为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;
}
}
I'va是一个OID接口,可以由许多具体类型实现: 现在我有一个具有两个字段的对象,一个使用抽象接口类型(OID)定义,另一个使用具体类型(MyOID)定义 我想使用jackson以不同的方式序列化/反序列化字段,无论它们是使用抽象接口类型还是具体类型定义的: 注意,被序列化,包括类型信息(多态序列化),而被序列化为文本 为此,我将OID接口注释为: 并为每个具体类型分配了类型id: 最后,对容器
情况如下:我已经设法让Jackson反序列化以下通用 作为HTTP客户端,并使用exchange
我想反序列化表单中的类: 其中文本是加密的,反序列化应该在重建TestFieldEncryptedMessage实例之前取消对值的加密。 我采用的方法非常类似于:https://github.com/codesqueak/jackson-json-crypto 也就是说,我正在构建一个扩展SimpleModule的模块: 如您所见,设置了两个修饰符:EncryptedSerializerModif
我在Jackson的自定义反序列化程序中有一个问题。我想访问默认序列化程序来填充我要反序列化到的对象。在填充之后,我将执行一些自定义操作,但首先我要使用默认的Jackson行为反序列化对象。 这是我现在有的代码。 我需要的是一种初始化默认反序列化器的方法,这样我就可以在开始我的特殊逻辑之前预填充我的POJO。 当从自定义反序列化程序内调用deserialize时,无论我如何构造序列化程序类,该方法
easyopen序列化使用fastjson处理json,xstream处理xml。现在我们来自定义实现一个json处理: 新建一个类JsonFormatter,实现ResultSerializer接口 public class JsonFormatter implements ResultSerializer { @Override public String serialize(
我有一个Spring项目,我尝试添加一个自定义反序列化器来反序列化日期属性,具体取决于它们的格式。如果我将其用作Date属性的注释,则效果很好。但是,如果我将反序列化器添加到对象映射器中,当Jackson反序列化日期时,它不会调用。 我尝试这样应用我的自定义反序列化程序: 我不想每次都对Date属性应用注释,我想默认使用此反序列化器。我做错了什么?