让Jackson在所有地方都使用自定义解串器(对于不是我的类型) [英] Make Jackson use a custom deserializer everywhere (for a type which isn't mine)
问题描述
我正在尝试设置Jackson JSON自定义反序列化器,以将JSON值转换为Long
对象.
我按照此网站上的说明进行操作: http://wiki.fasterxml.com/JacksonHowToCustomDeserializers 来设置自定义解串器.
I am trying to setup Jackson JSON custom deserializer to convert JSON values into a Long
object.
I followed the instructions on this site : http://wiki.fasterxml.com/JacksonHowToCustomDeserializers to setup the custom deserializer.
但是,要启用自定义反序列化程序,我每次都必须始终添加注释 例如
However, for the custom deserializer to kick in, I have to always annotate each time e.g.
public class TestBean {
Long value;
@JsonDeserialize(using=LongJsonDeserializer.class)
public void setValue(Long value) {
this.value = value;
}
}
是否有一种方法可以告诉Jackson始终使用自定义反序列化器对所有Long
属性进行反序列化,而不必每次都使用@JsonDeserialize(using=LongJsonDeserializer.class)
批注?
Is there a way to tell Jackson to always use the custom deserializer to deserialize all Long
properties without having to use the @JsonDeserialize(using=LongJsonDeserializer.class)
annotation each time?
推荐答案
LongJsonDeserializer deserializer = new LongJsonDeserializer();
SimpleModule module =
new SimpleModule("LongDeserializerModule",
new Version(1, 0, 0, null, null, null));
module.addDeserializer(Long.class, deserializer);
ObjectMapper mapper = new ObjectMapper();
mapper.registerModule(module);
这是一个完整的演示应用程序.这适用于最新版本的Jackson,也可能适用于Jackson版本回到1.7.
Here's a full demo application. This works with the latest release of Jackson, and probably also with Jackson versions going back to 1.7.
import java.io.IOException;
import org.codehaus.jackson.JsonParser;
import org.codehaus.jackson.JsonProcessingException;
import org.codehaus.jackson.Version;
import org.codehaus.jackson.map.DeserializationContext;
import org.codehaus.jackson.map.JsonDeserializer;
import org.codehaus.jackson.map.ObjectMapper;
import org.codehaus.jackson.map.module.SimpleModule;
public class Foo
{
public static void main(String[] args) throws Exception
{
TestBean bean = new TestBean();
bean.value = 42L;
ObjectMapper mapper = new ObjectMapper();
String beanJson = mapper.writeValueAsString(bean);
System.out.println(beanJson);
// output: {"value":42}
TestBean beanCopy1 = mapper.readValue(beanJson, TestBean.class);
System.out.println(beanCopy1.value);
// output: 42
SimpleModule module =
new SimpleModule("LongDeserializerModule",
new Version(1, 0, 0, null));
module.addDeserializer(Long.class, new LongJsonDeserializer());
mapper = new ObjectMapper();
mapper.registerModule(module);
TestBean beanCopy2 = mapper.readValue(beanJson, TestBean.class);
System.out.println(beanCopy2.value);
// output: 126
}
}
class TestBean
{
Long value;
public Long getValue() {return value;}
public void setValue(Long value) {this.value = value;}
}
class LongJsonDeserializer extends JsonDeserializer<Long>
{
@Override
public Long deserialize(JsonParser jp, DeserializationContext ctxt) throws IOException, JsonProcessingException
{
Long value = jp.getLongValue();
return value * 3;
}
}
这篇关于让Jackson在所有地方都使用自定义解串器(对于不是我的类型)的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!