【问题标题】:Scala Enum Serialization Fails using Jackson when DefaultTyping is enabled启用 DefaultTyping 时使用 Jackson Scala 枚举序列化失败
【发布时间】:2020-01-10 23:10:34
【问题描述】:

当使用 OBJECT_AND_NON_CONCRETE 设置启用 DefaultTyping 时,我看到 Jackson 库无法序列化 Scala 枚举。请注意,当我使用JAVA_LANG_OBJECT 设置时,序列化工作正常。

我看到以下异常

[scalatest]   com.fasterxml.jackson.databind.JsonMappingException: Type id handling not implemented for type scala.Enumeration$Val (by serializer of type com.fasterxml.jackson.module.scala.ser.EnumerationSerializer) (through reference chain: <MyType>)
[scalatest]   at com.fasterxml.jackson.databind.JsonMappingException.from(JsonMappingException.java:284)
[scalatest]   at com.fasterxml.jackson.databind.SerializerProvider.mappingException(SerializerProvider.java:1110)
[scalatest]   at com.fasterxml.jackson.databind.SerializerProvider.reportMappingProblem(SerializerProvider.java:1135)
[scalatest]   at com.fasterxml.jackson.databind.JsonSerializer.serializeWithType(JsonSerializer.java:160)
[scalatest]   at com.fasterxml.jackson.databind.ser.BeanPropertyWriter.serializeAsField(BeanPropertyWriter.java:706)
[scalatest]   at com.fasterxml.jackson.databind.ser.std.BeanSerializerBase.serializeFields(BeanSerializerBase.java:689)
[scalatest]   at com.fasterxml.jackson.databind.ser.BeanSerializer.serialize(BeanSerializer.java:155)
[scalatest]   at com.fasterxml.jackson.databind.ser.DefaultSerializerProvider.serializeValue(DefaultSerializerProvider.java:292)
[scalatest]   at com.fasterxml.jackson.databind.ObjectMapper.writeValue(ObjectMapper.java:2509)
[scalatest]   at com.fasterxml.jackson.core.base.GeneratorBase.writeObject(GeneratorBase.java:378)

这是一个示例代码

  object Day extends Enumeration {
    val Mon, Tue, Wed, Thu, Fri, Sat, Sun = Value
  }

  case class Holiday(day: Day.Value)

  val objectMapper = new ObjectMapper()
  objectMapper.registerModule(DefaultScalaModule)
  objectMapper.configure(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES, false)
  objectMapper.configure(DeserializationFeature.FAIL_ON_INVALID_SUBTYPE, false)
  objectMapper.enableDefaultTyping(DefaultTyping.OBJECT_AND_NON_CONCRETE, JsonTypeInfo.As.PROPERTY)

我已尝试使用https://github.com/FasterXML/jackson-module-scala/wiki/Enumerations 中提到的@JsonScalaEnumeration,但似乎没有帮助。

提前致谢。

【问题讨论】:

  • 作为 W/A,您可以使用 jsoniter-scala - 它支持 Scala 和 Java 枚举以及其他功能的任意组合。此外,它在解析和序列化它们时效率更高 - 请参阅ArrayOfEnumADTsReadingArrayOfEnumsWritingArrayOfJavaEnumsReadingArrayOfJavaEnumsWriting 基准测试here 的结果。
  • @Andriy Plokhotnyuk - 感谢您的回复。我通过调整枚举定义使其工作,如下所示。

标签: scala jackson jackson-modules jackson-module-scala


【解决方案1】:

我得到了这样的解决方法

  object Day extends Enumeration {
    type Day = Value
    //val Mon, Tue, Wed, Thu, Fri, Sat, Sun = Value
    case class Val(dayName: String) extends super.Val

    val Mon = Val("Monday")
    val Tue = Val("Tuesday")
    val Sat = Val("Saturday")
    val Sun = Val("Sunday")
  }

  class DayType extends TypeReference[Day.type]

  case class Holidays(@JsonScalaEnumeration(classOf[DayType]) days: Day.Val)

【讨论】:

  • 伟大的自学作品,@Varun!我很好奇它是否可以与 Scala 的枚举在运行时添加新值的能力一起使用。
猜你喜欢
  • 1970-01-01
  • 2014-07-16
  • 2011-12-07
  • 1970-01-01
  • 2015-10-19
  • 2020-02-27
  • 1970-01-01
  • 2012-03-02
相关资源
最近更新 更多