[英]Exclude custom deserializer with jackson
In my pojo class I have configured a CustomDeserializer with annotation 在我的pojo类中,我已经配置了带注释的CustomDeserializer
@JsonDeserialize(using = CustomDeserializer.class)
class Myclass {
private String A;
@JsonIgnore
private String B;
@JsonIgnore
private String C;
private String D;
...
private String Z;
/*getters and setters*/
}
In CustomDeserializer
, I want to manage only some of the fields and leave the rest for Jackson to manage. 在
CustomDeserializer
,我只想管理某些字段,其余的留给Jackson来管理。
CustomDeserializer.java CustomDeserializer.java
public class CustomDeserializer extends StdDeserializer<Myclass > {
private static final long serialVersionUID = 4781685606089836048L;
public CustomDeserializer() {
super(Myclass.class);
}
@Override
public Myclass deserialize(JsonParser jp, DeserializationContext ctxt) throws IOException, IllegalResponseException {
ObjectMapper mapper = (ObjectMapper) jp.getCodec();
ObjectNode root = (ObjectNode) mapper.readTree(jp);
Myclass myClass = mapper.readValue(root.toString(), Myclass.class);
//--- HERE MANAGE FIELD B ---
myClass.setB(myNewB);
//--- HERE MANAGE FIELD C ---
myClass.setC(myNewC);
return myClass;
}
}
This way I run into an infinite loop because of the following line: 这样,由于以下几行,我陷入了无限循环:
mapper.readValue(root.toString(), Myclass.class);
Is there a way to set default behavior when using Jackson so that I can exclude my CustomDeserializer? 使用Jackson时,是否可以设置默认行为,以便排除CustomDeserializer?
The problem is that you will need a fully constructed default deserializer; 问题是您将需要一个完全构造的默认解串器; and this requires that one gets built, and then your deserializer gets access to it.
这需要先构建一个,然后您的解串器才能访问它。
DeserializationContext
is not something you should either create or change; DeserializationContext
不是您应该创建或更改的东西; it will be provided by ObjectMapper
. 它将由
ObjectMapper
提供。
To meet your requirement you can start by writing a BeanDeserializerModifier
and registering it via SimpleModule
. 为了满足您的要求,您可以先编写一个
BeanDeserializerModifier
并通过SimpleModule
注册它。
The following example should work: 下面的示例应该起作用:
public class CustomDeserializer extends StdDeserializer<Myclass> implements ResolvableDeserializer
{
private static final long serialVersionUID = 7923585097068641765L;
private final JsonDeserializer<?> defaultDeserializer;
public CustomDeserializer (JsonDeserializer<?> defaultDeserializer)
{
super(Myclass.class);
this.defaultDeserializer = defaultDeserializer;
}
@Override public Myclass deserialize(JsonParser jp, DeserializationContext ctxt)
throws IOException, JsonProcessingException
{
Myclass deserializedMyclass = (Myclass) defaultDeserializer.deserialize(jp, ctxt);
// custom logic
return deserializedMyclass;
}
// You have to implement ResolvableDeserializer when modifying BeanDeserializer
// otherwise deserializing throws JsonMappingException
@Override public void resolve(DeserializationContext ctxt) throws JsonMappingException
{
((ResolvableDeserializer) defaultDeserializer).resolve(ctxt);
}
public static void main(String[] args) throws JsonParseException, JsonMappingException, IOException
{
SimpleModule module = new SimpleModule();
//Writing a new BeanDeserializerModifier
module.setDeserializerModifier(new BeanDeserializerModifier()
{
@Override public JsonDeserializer<?> modifyDeserializer(DeserializationConfig config, BeanDescription beanDesc, JsonDeserializer<?> deserializer)
{
if (beanDesc.getBeanClass() == Myclass.class)
return new CustomDeserializer(deserializer);
return deserializer;
}
});
//register the BeanDeserializerModifier via SimpleModule
ObjectMapper mapper = new ObjectMapper();
mapper.registerModule(module);
Myclass myclass = mapper.readValue(new File("d:\\test.json"), Myclass.class);
}
}
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.