当前位置: 首页 > 面试题库 >

让Jackson在所有地方都使用自定义解串器(对于不是我的类型)

闻人宝
2023-03-14
问题内容

我正在尝试设置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);

这是完整的演示应用程序。这适用于杰克逊的最新版本,可能还适用于杰克逊版本回到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 JSON自定义解串器,以将JSON值转换为对象。我按照此站点上的说明进行操作:http : //wiki.fasterxml.com/JacksonHowToCustomDeserializers来设置自定义解串器。 但是,为了使自定义解串器生效,我必须每次都添加注释,例如 有没有办法告诉Jackson总是使用自定义反序列化器对所有属性进行反序列化,而不必

  • 在这个岗位上,, 获取在Laravel 3/4中执行的查询 Ricardo Rossi提供了一个关于使用Kint和自定义类轻松输出有关使用查询生成器创建的Laravel查询的信息的极好答案。 我能够使用composer设置Kent,但我是Laravel的新手,从版本4开始就没有使用过PHP。 有人能提供一个例子来描述如何创建一个可以从任何地方调用的类吗?在他的例子中,里卡多说他使用“DBH::q(

  • 问题内容: 我在Jackson的自定义解串器中遇到问题。我想访问默认的序列化器以填充要反序列化的对象。填充之后,我将执行一些自定义操作,但首先,我想使用默认的Jackson行为反序列化对象。 这是我目前拥有的代码。 我需要的是一种初始化默认反序列化器的方法,以便在启动特殊逻辑之前可以预先填充POJO。 从自定义反序列化器中调用反序列化时,无论我如何构造序列化器类,似乎都是从当前上下文中调用该方法。

  • 对于Jackson的序列化,定义自定义bean为空的正确方法是什么? 我想用Json过滤不需要的字段- 目前,如果属于自定义bean的所有变量都为null,我有一个额外的方法将null值分配给它。我在寻找的是,这是否可以由杰克逊来完成。 内容识别类 预期产量 和 电流输出 和

  • 问题内容: 想象以下情况: 我想为Foo写一个定制的Jackson解串器。为了做到这一点(例如,为了反序列化类,它具有属性),我需要知道的具体类型,在使用,在反序列化时间(比如我需要知道是在particluar情况下)。 一个人怎么写这样的反序列化器?因为杰克逊使用类型化的集合和地图来做到这一点,所以应该有可能做到这一点。 说明: 似乎有两个部分可以解决问题: 1)获取内部声明的属性类型并使用其反

  • 问题内容: 我认为这是由于与客户端计算机建立的连接不安全。 这是由于你正在与HTTP服务器而不是HTTPS服务器进行通信。可能你没有为HTTPS使用正确的端口号。我在Jackson的自定义解串器中遇到问题。我想访问默认的序列化器以填充要反序列化的对象。填充之后,我将执行一些自定义操作,但首先,我想使用默认的Jackson行为反序列化对象。 这是我目前拥有的代码。 我需要的是一种初始化默认反序列化器