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

如何在Jackson的自定义解串器中调用默认解串器

暴才俊
2023-03-14
问题内容

我在Jackson的自定义解串器中遇到问题。我想访问默认的序列化器以填充要反序列化的对象。填充之后,我将执行一些自定义操作,但首先,我想使用默认的Jackson行为反序列化对象。

这是我目前拥有的代码。

public class UserEventDeserializer extends StdDeserializer<User> {

  private static final long serialVersionUID = 7923585097068641765L;

  public UserEventDeserializer() {
    super(User.class);
  }

  @Override
  @Transactional
  public User deserialize(JsonParser jp, DeserializationContext ctxt)
      throws IOException, JsonProcessingException {

    ObjectCodec oc = jp.getCodec();
    JsonNode node = oc.readTree(jp);
    User deserializedUser = null;
    deserializedUser = super.deserialize(jp, ctxt, new User()); 
    // The previous line generates an exception java.lang.UnsupportedOperationException
    // Because there is no implementation of the deserializer.
    // I want a way to access the default spring deserializer for my User class.
    // How can I do that?

    //Special logic

    return deserializedUser;
  }

}

我需要的是一种初始化默认反序列化器的方法,以便在启动特殊逻辑之前可以预先填充POJO。

从自定义反序列化器中调用反序列化时,无论我如何构造序列化器类,似乎都是从当前上下文中调用该方法。由于我的POJO中有注释。由于明显的原因,这会导致堆栈溢出异常。

我曾尝试初始化a,BeanDeserializer但是过程极其复杂,而且我还没有找到正确的方法来进行初始化。我也尝试过重载AnnotationIntrospector,但毫无用处,以为这可能会帮助我忽略中的注释DeserializerContext。最终,它表明我可能已经取得了一些成功,JsonDeserializerBuilders尽管这需要我做一些神奇的事情来掌握Spring的应用程序上下文。我将不胜感激任何可以引导我使用更简洁解决方案的方法,例如,如何在不阅读JsonDeserializer注释的情况下构造反序列化上下文。


问题答案:

正如StaxMan已经建议的那样,您可以通过编写a
BeanDeserializerModifier并通过进行注册来实现SimpleModule。下面的示例应该起作用:

public class UserEventDeserializer extends StdDeserializer<User> implements ResolvableDeserializer
{
  private static final long serialVersionUID = 7923585097068641765L;

  private final JsonDeserializer<?> defaultDeserializer;

  public UserEventDeserializer(JsonDeserializer<?> defaultDeserializer)
  {
    super(User.class);
    this.defaultDeserializer = defaultDeserializer;
  }

  @Override public User deserialize(JsonParser jp, DeserializationContext ctxt)
      throws IOException, JsonProcessingException
  {
    User deserializedUser = (User) defaultDeserializer.deserialize(jp, ctxt);

    // Special logic

    return deserializedUser;
  }

  // for some reason 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();
    module.setDeserializerModifier(new BeanDeserializerModifier()
    {
      @Override public JsonDeserializer<?> modifyDeserializer(DeserializationConfig config, BeanDescription beanDesc, JsonDeserializer<?> deserializer)
      {
        if (beanDesc.getBeanClass() == User.class)
          return new UserEventDeserializer(deserializer);
        return deserializer;
      }
    });


    ObjectMapper mapper = new ObjectMapper();
    mapper.registerModule(module);
    User user = mapper.readValue(new File("test.json"), User.class);
  }
}


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

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

  • 问题内容: 我有以下三个应用程序: 项目1举行 业务逻辑(Spring Cloud功能) 接口 IDemoEntity 项目二 AWS特定的处理程序 IDemoEntity的 一种实现,具有DynamoDB特定的注释 该项目基于Spring Boot 项目3 IDemoEntity的 一种实现,带有CosmosDB批注 Azure特定的处理程序 项目1的类如下所示: 对于项目2,IDemoEnti

  • 我已经创建了一个消费者来接收来自Kafka主题的消息,但是我正在手动解析消息,有没有一种方法可以使用自定义的反序列化器来自动解析这个主题消费者? 预期结果是: 如果出现解析错误,我可以设置回调来处理此错误吗?

  • 问题内容: 我有一个Java类,用户: 我收到一个包含来自Web服务的用户对象的JSON列表: 我试图编写一个自定义反序列化器: 但是我的解串器不起作用。如何为Gson编写自定义JSON解串器? 问题答案: 我假设User类具有适当的构造函数。

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