關於 Jackson Json 對多型的支援,原開發者已經有一篇 blog 很清楚的解釋該怎麼做,因此,我只寫下在 scala 上面要注意的眉角。

首先,我先寫下理想中,Jackson在Scala上該怎麼使用,在來談,為什麼不能這麼用
@JsonTypeInfo(use = JsonTypeInfo.Id.NAME, include = JsonTypeInfo.As.PROPERTY, property = "type")
@JsonSubTypes(Array(
new JsonSubTypes.Type(name = "flood", value = classOf[Flood]),
new JsonSubTypes.Type(name = "mountainslide", value = classOf[MountainSlide])
))
trait Disaster {}

case class Flood @JsonCreator()(
@BeanProperty @JsonProperty("event") event: String,
@BeanProperty @JsonProperty("address") address: String
) extends Disaster

case class MountainSlide @JsonCreator()(
@BeanProperty @JsonProperty("event") event: String,
@BeanProperty @JsonProperty("landmark") landmark: String
) extends Disaster


在 scala 2.8.0 上面,我碰上的問題是不能在annotation內使用 java enum 如: use = JsonTypeInfo.Id.NAME

在 scala 2.9.1 上,上面的問題消失了,不過碰上另一個問題,當一個 annotation 上面有兩個 java enum,scala compiler 及 java compiler 都不會吐出錯誤,但是annotations從bytecode中消失了,SI-5165中紀錄了這問題。

不管怎樣,在現在這時間,若是你想用Jackson + Scala來處理多型,那麼,最頂層類別,一定要用Java來寫,才不會碰上上述兩個問題。