2013-09-25 99 views
0

元組2的作品不是在編譯的時候我做了一個隱含的JSON調用在Playframework:元組3在斯卡拉/ Playframework

def toJson(itemTuple: List[((Item, ItemOption), List[Picture])]) : JsObject = { ... } 

我定義的隱寫操作方法,所有的罰款。在這種情況下,我可以一個「外」 JSON塊內通過像這樣的列表:

"items" -> Json.toJson(itemTupleList) 

和它的隱式方法「的toJSON」在每個元件上被執行。然而,當我把它擴展到一個元組3失敗:

def toJson(itemTuple: List[((Item, ItemOption, ItemAttribute), List[Picture])]) : JsObject = { ... } 

這產生了:

sbt.PlayExceptions$CompilationException: Compilation error[No Json deserializer found for type List[(models.butik.Item, models.butik.ItemOption, models.butik.ItemAttribute)]. Try to implement an implicit Writes or Format for this type.] 

我想我所做的:

implicit val iW = new Writes[((Item, ItemOption, ItemAttribute), List[Picture])] { ... } 

,這是什麼原因呢?有沒有隱式方法實現相同的另一種方法(我是一個新的斯卡拉)。

(BTW:對項目數據分成三個容器的原因是由於油滑依賴於斯卡拉的22元組元素。)

回答

1

這個工作對我來說:

import play.api.libs.json._ 

object Scratch { 

    def main(args: Array[String]): Unit = { 
    println(toJson(List(((1, 2, 3), List(3))))) 
    } 

    def toJson(itemTuple: List[((Item, ItemOption, ItemAttribute), List[Picture])]) : JsValue = 
    Json.toJson(itemTuple) 

    implicit val iW: Writes[((Item, ItemOption, ItemAttribute), List[Picture])] = new Writes[((Item, ItemOption, ItemAttribute), List[Picture])] { 
    def writes(x: ((Item, ItemOption, ItemAttribute), List[Picture])) = Json.parse("[1, 2, 3, [3]]") // TODO 
    } 

    type Item = Int 
    type ItemOption = Int 
    type ItemAttribute = Int 
    type Picture = Int 
} 

% cat build.sbt 
scalaVersion := "2.10.2" 

libraryDependencies ++= Seq(
    "com.typesafe.play" %% "play-json" % "2.2.0-RC2" 
) 

resolvers += "Typesafe Repository" at "http://repo.typesafe.com/typesafe/releases/" 

% sbt run 
[info] Loading project definition from /Users/jason/code/scratch4/project 
[info] Set current project to scratch4 (in build file:/Users/jason/code/scratch4/) 
[info] Running scratch.Scratch 
[[1,2,3,[3]]] 
[success] Total time: 0 s, completed Sep 26, 2013 1:16:21 PM 

確保來註釋implicits的返回類型,而不是使用推斷出的類型。如果隱含出現低於所需的位置和返回類型不明確,編譯器將不會考慮它。如果確實如此,則類型推斷可能會陷入討厭的循環。

順便說一句,你可以清理代碼變得有型的別名:

def toJson(itemTuple: List[Record]): JsValue = 
    Json.toJson(itemTuple) 

    implicit def recordWrite: Writes[Record] = new Writes[Record] { 
    def writes(rec: Record) = { 
     Json.parse("{}") // TODO 
    } 
    } 

    type Record = ((Item, ItemOption, ItemAttribute), List[Picture]) 
    type Item = Int 
    type ItemOption = Int 
    type ItemAttribute = Int 
    type Picture = Int 
}