用于第三方库的自定义jackson解串器

时间:2013-11-26 20:31:51

标签: java json jackson

我正在尝试为第三方库中的类编写自定义Jackson反序列化器。我已经为一个基本类(持续时间)创建了一个,但现在我正在尝试为具有Duration实例的类(RetryPolicy)编写下一个类,我不太确定如何继续。我想使用我的持续时间解串器,所以我不必重复它的逻辑。

这是一个代码示例:

RetryPolicy rp = 
    new RetryPolicy()
    .withRetryInterval(Duration.seconds(2))
    .withBackoff(Duration.seconds(2), Duration.minutes(30), 2)
    .withMaxDuration(Duration.hours(1))
    .withMaxRetries(100);

正如我所说,我已经有了一个用于Duration的反序列化器,如果我创建一个模块并将我的DurationDeserializer类添加到它然后将该模型注册到ObjectMapper,我似乎几乎能够反序列化以下JSON:

{
  "retryInterval": "2 seconds",
  "backoff": {
      "retryInterval": "2 seconds", 
      "maxRetryInterval": "5 minutes", 
      "retryIntervalMultiplier": 2
  },
  "maxDuration": "30 minutes",
  "maxRetries": 100
}

我得到的例外是:

Caused by: com.fasterxml.jackson.databind.exc.UnrecognizedPropertyException: Unrecognized field "backoff" (class net.jodah.lyra.retry.RetryPolicy), not marked as ignorable (5 known properties: , "maxRetries", "maxDuration", "maxRetryInterval", "retryInterval", "retryIntervalMultiplier"])

所以它实际上似乎能够自己填充所有的Duration和int字段(即使这个类使用的是构建器模式而没有build()方法。唯一有问题的是withBackoff(Duration) ,持续时间,int)方法。

我不太确定从哪里开始。我是否为RetryPolicy类编写自定义反序列化程序?如果是这样,我如何避免解析所有JSON(例如,我只想将所有的Duration变量委托给我已经建立的DurationDeserializer类)?

我应该注意(尽管可能很明显)我无法注释第三方库(Duration和RetryPolicy类),这就是我采用自定义序列化方式的原因。

1 个答案:

答案 0 :(得分:0)

有更复杂的方法可以做到这一点,但最简单的方法是查看SerializerProvider中的委派方法(请参阅defaultSerializeValue())和DeserializationContext(请参阅{{1 }}:这些对象被传递给您的自定义(de)序列化程序。 因此,您可以将处理委托给(de)为值类型注册的序列化程序。这与您要处理默认方式的任何类型(无论配置了哪个映射器)都使用相同的方法。