2015-07-10 54 views
4

當我嘗試在scala中使用json4s序列化AnyVal序列時遇到問題。使用json4s序列化AnyVal的序列

下面是測試使用FunSuite能重現問題:

import org.json4s._ 
    import org.json4s.jackson.JsonMethods._ 
    import org.json4s.jackson.Serialization._ 
    import org.scalatest.{FunSuite, Matchers} 

    case class MyId(id: String) extends AnyVal 

    case class MyModel(ids: Seq[MyId]) 

    class AnyValTest extends FunSuite with Matchers { 

    test("should serialize correctly") { 

     implicit val formats = DefaultFormats 

     val model = MyModel(Seq(MyId("1"), MyId("2"))) 
     val text = write(model) 

     parse(text).extract[MyModel] shouldBe model 
    } 
    } 

試圖從JValue提取爲MyModel,因爲它無法找到該ids場一個合適的值時,測試失敗。

我注意到它AnyVal工作正常,雖然直接用類似使用時:

case class AnotherModel(id: MyId) 

然後我能夠連載和正確deserialise。

+0

是不是'case class MyId(id:String)extends AnyVal'在你看來有什麼意義?如果你想擴展一些行爲,也許最好使用* Traits *,你不這麼認爲嗎? – Gregg

回答

0

我知道這個問題是一歲,但我遇到了同樣的問題。寫下我爲了幫助別人而做的事情。您將需要一個自定義序列化程序。

case class Id(asString: String) extends AnyVal 

class NotificationSerializer extends CustomSerializer[Id](format ⇒ (
    {case JString(s) => Id(s)}, 
    {case Id(s) => JString(s)})) 

沒有上面的序列化,你的JSON看起來像

{"ids":[[{"asString":"testId1"},{"asString":"testId2"}]]} 

我不完全知道爲什麼AnyVal案例類的序列化工作正常時,它是另一種情況階級的一部分,但不是獨立的。我最好的猜測是這種行爲是由於JVM對包含值類的數組的分配行爲。請參閱http://docs.scala-lang.org/overviews/core/value-classes.html以瞭解'何時需要分配'部分。