2012-06-18 23 views
3

我正在使用Play Framework 2.0,它使用Jerkson來解析JSON字符串。我用它成功地解析字符串的不可變列表,像這樣:如何解析scala中的mutableList作爲播放框架2.0上的JSON?

Json.parse(jsonStr).as[ List[String] ] 

但是當我嘗試

Json.parse(jsonStr).as[ MutableList[String] ] 

有誰知道我可以很容易地做到這一點這個代碼不爲我工作?

+0

類'MutableList'來自? – missingfaktor

+0

@missingfaktor我認爲他指的是[scala.collection.mutable.MutableList](http://www.scala-lang.org/api/current/scala/collection/mutable/MutableList.html) –

+0

@DanSimon,謝謝。三年的斯卡拉,這是我第一次看到那堂課。 – missingfaktor

回答

2

例如, new MutableList[String]() ++= Json.parse(jsonStr).as[ List[String] ](假設@DanSimon關於你的意思是正確的)。但是Scala中最常用的可變列表類集合是Buffer,它可以獲得爲Buffer(Json.parse(jsonStr).as[ List[String] ]Json.parse(jsonStr).as[ List[String] ].toBuffer

+0

謝謝,我不知道Buffer是更常用的可變列表式集合。 – wynnch

+0

但是,非常感謝,這真的很有幫助! – wynnch

3

你的第二個行會工作,因爲它是在玩2.0的未來版本中,通過traversableReadsin the current trunk由於更換seqReads

implicit def traversableReads[F[_], A](implicit bf: generic.CanBuildFrom[F[_], A, F[A]], ra: Reads[A]) = new Reads[F[A]] { 
    def reads(json: JsValue) = json match { 
    case JsArray(ts) => { 
     val builder = bf() 
     for (a <- ts.map(fromJson[A](_))) { 
     builder += a 
     } 
     builder.result() 
    } 
    case _ => throw new RuntimeException("Collection expected") 
    } 
} 

所以,如果你願意to build Play from source,或等待,很好。否則,您應該能夠將方法放在您自己代碼中的某處以獲取合適的Reads實例,或者甚至更好 - 僅使用Alexey Romanov的解決方案,或者最好 - 不要使用MutableList

+0

對不起,但我應該把這個方法放在我的代碼中? – wynnch

+0

這是一個隱式方法,它爲集合類型創建'Reads' [type class](http://stackoverflow.com/questions/5408861/what-are-type-classes-in-scala-useful-for)的實例根據需要,所以您應該可以將它放在範圍內的任何位置(您可能需要添加一個導入 - 或將調用限定爲-json.fromJson)。 –