gpt4 book ai didi

java - 让 Jackson 在任何地方都使用自定义反序列化器(对于不是我的类型)

转载 作者:太空狗 更新时间:2023-10-29 23:02:34 25 4
gpt4 key购买 nike

我正在尝试设置 Jackson JSON 自定义反序列化器以将 JSON 值转换为 Long 对象。我按照本网站上的说明进行操作:http://wiki.fasterxml.com/JacksonHowToCustomDeserializers设置自定义解串器。

但是,要启动自定义反序列化器,我必须每次都进行注释例如

public class TestBean {
Long value;

@JsonDeserialize(using=LongJsonDeserializer.class)
public void setValue(Long value) {
this.value = value;
}
}

有没有办法告诉 Jackson 始终使用自定义反序列化器反序列化所有 Long 属性,而不必使用 @JsonDeserialize(using=LongJsonDeserializer.class) 注释每次?

最佳答案

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 的最新版本,也可能适用于回溯到 1.7 的 Jackson 版本。

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;
}
}

关于java - 让 Jackson 在任何地方都使用自定义反序列化器(对于不是我的类型),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6553051/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com