杰克逊解串器基于价值回落

时间:2018-01-25 21:39:57

标签: java json serialization jackson

是否有可能创建一个与其他人“链接”的杰克逊解串器。例如,我们有一个用于处理特殊情况的Enumerations的通用自定义反序列化器,但是如果自定义反序列化器无法处理传入的枚举,我们希望回退到默认的Jackson实现。

似乎没有简单的方法在的基础上执行此操作 - 但是,我已经在类型级别上看到了类似的示例。

问题似乎源于这样的事实:为特定类注册反序列化器使得反序列化器优先于已注册的任何其他序列化器,因此先前注册的反序列化器将丢失。似乎没有内置链接的概念,因此从自定义反序列化器返回null不会将值传递给该类型的已注册反序列化器链。

有关如何将反序列化器链接到链的任何见解将不胜感激!

更新 以下是预期行为与(简化)当前设置的示例。

目前的设置:

fork

在此示例中,反序列化器将在使用其“name”值序列化的Enum上失败,而不是其“toString”(可能被覆盖)。理想情况下,我希望此自定义设置委派给对象映射器上的任何以前有界反序列化器来处理该值。

所以...在伪代码中:

object EnumSerializerModule extends JacksonModule {
  override def getModuleName: String = "permissive-enums"

  this += { _.addDeserializers(PermissiveEnumDeserializerLocator) }
}

object PermissiveEnumDeserializerLocator extends Deserializers.Base {
  override def findEnumDeserializer(javaType: Class[_], config: DeserializationConfig, desc: BeanDescription): JsonDeserializer[_] = {
    new PermissiveEnumDeserializer(javaType.asInstanceOf[Class[Enum[_ <: Enum[_]]]])
  }
}

// Super simplified version of a custom enum deserializer
class PermissiveEnumDeserializer(javaType: Class[Enum[_ <: Enum[_]]]) extends StdScalarDeserializer[Enum[_ <: Enum[_]]](javaType) {
  override def deserialize(jp: JsonParser, ctxt: DeserializationContext): Enum[_ <: Enum[_]] = {
    val enumConstants = javaType.getEnumConstants

    // Attempt string representation
    val constant: Enum[_ <: Enum[_]] = val fromStringRep = enumConstants.find(_.toString.equalsIgnoreCase(text)).orNull

    if (constant != null) {
      return constant
    }

    throw ctxt.mappingException(jp.getText + " was not one of " + enumConstants.map(_.name).mkString("[", ", ", "]"))
  }
}

0 个答案:

没有答案