2013-08-03 27 views
0

相當簡單的場景。我有:播放2.1.2:傑克遜似乎不支持這裏的@JsonTypeInfo

@JsonTypeInfo(use = JsonTypeInfo.Id.CLASS, include = JsonTypeInfo.As.PROPERTY, property = "@type") 
class Thing(val id: Int) 

...

class LowerThing(id: Int) extends Thing(id) 

(我Json.read和Json.writes兩個類定義和必要的應用/不應用方法(它做簡單的事情 - 就好像它們是case類)

在一個控制器,在後我有:

request => 
     val thing = request.body.asJson.get.as[Thing] 

我可以張貼學家SON是這樣的:

{"@type":"com.foo.LowerThing","id":1} 

或任何其他子類,但Jerkson總是給我一個直的事回來。

此外,當事物被序列出來,@type不包括,使它不可能爲客戶端實例化正確的對象類型上的另一端。

需要注意的是幾乎完全一樣的代碼的Java EE服務器下正常工作與傑克遜。甚至是老版本的傑克遜。我試圖證明一切都轉向了所有Scala &從Java EE開始玩,大多數情況下它變得非常美妙,但是這樣的事情必須要做出來,對我們來說真的是太遺憾了。處理我們自己的多態性JSON序列 - 必須有辦法做到這一點,但我不能很容易地找到它,我很困惑,爲什麼這不只是工作,因爲傑克遜是傑克遜)

回答

0

。好吧,我是能夠解決的問題,通過直接傑克遜API:

val mapper = new ObjectMapper().setVisibility(JsonMethod.FIELD, Visibility.ANY) 
    mapper.configure(DeserializationConfig.Feature.FAIL_ON_UNKNOWN_PROPERTIES, false) 
    val thing = mapper.readValue(request.body.asJson.get.toString, classOf[Thing]) 

它擊中了我,玩的JSON庫可能不會使用千斤頂以我熟悉的方式開展工作 - 如果他們不需要參與,那麼這將是必要的,而不是Json讀/寫所使用的應用/不應用。

我不想使用這種機制,因爲使不可變對象變得困難或不可能,所以我仍然很感激有人向我展示如何使用Play的JSON庫直接實現多態JSON反序列化。

+0

不變性仍然是可能的 - 你只需要零ARG構造函數。我仍然更喜歡使用Play的更慣用的Scala JSON工具。 –

+0

是否真的沒有直接的方法來實現Play JSON API的多態JSON序列化? –