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

让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);

这是完整的演示应用程序。这适用于最新版本的Jackson,也可能适用于Jackson版本回到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。 从自定义反序列化器中调用反序列化时,无论我如何构造序列化器类,似乎都是从当前上下文中调用该方法。

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

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

  • 我一直在为我的一个类使用自定义的typeId解析器,到目前为止,我一直依赖于注释支持: 但是现在我需要通过构造函数或setter向它传递一些其他依赖项来定制类型解析器的创建,而且由于jackson是实例化它的人,我找不到绕过它的方法。 是否有方法将ObjectMapper配置为使用TypeIdResolver而不是依赖注释? 问候