2013-05-20 83 views
0

隨着Jerkson,我能夠解析包含一個JSON陣列中的字符串,像這樣:播放2.1斯卡拉JSON解析比Jerkson更難?

com.codahale.jerkson.Json.parse[Array[Credentials]](contents) 

,其中內容是包含字符串如下:

[{"awsAccountName":"mslinn","accessKey":"blahblah","secretKey":"blahblah"}] 

...我會得到憑證數組。

(Brief diversion)我嘗試使用新的JSON解析器爲Play 2.1和Scala使用不同的數據做類似的事情。對於一個簡單的解析,以下工作正常。案例類(S3File)定義的不應用方法需要這個工作:

case class S3File(accountName: String, 
        bucketName: String, 
        endpoint: String = ".s3.amazonaws.com") 

implicit val s3FileFormat = Json.format[S3File] 
val jsValue = Json.parse(stringContainingJson) 
Json.fromJson(jsValue).get 

讓我們重新考慮包含JSON原始字符串稱爲內容。與所有集合一樣,對象數組也沒有不適用的方法。這意味着我在上述分流中展示的技術將無法工作。我試圖創建一個一次性案例類用於此目的:

case class ArrayCreds(payload: Array[Credentials]) 

implicit val credsFormat = Json.format[ArrayCreds] 
val jsValue = Json.parse(contents) 
val credArray = Json.fromJson(jsValue).get.payload 

...不幸的是,這種失敗:

No unapply function found 
[error]   implicit val credsFormat = Json.format[ArrayCreds] 
[error]            ^
[error]  
/blah.scala:177: diverging implicit expansion for type play.api.libs.json.Reads[T] 
[error] starting with method ArrayReads in trait DefaultReads 
[error]   val credArray = Json.fromJson(jsValue).get 
[error]         ^

是否有使用播放解析JSON陣列的2.1的一個簡單方法新的JSON解析器?我預計一次性case類是錯誤的做法,並隱含的需要而不是:

implicit val credsFormat = Json.format[Credentials] 

但我不知道如何寫反序列化的其餘部分以簡單的方式。我見過的所有代碼示例都比較冗長,這看起來與Scala的精神背道而馳。理想的咒語就像Jerkson的咒語一樣簡單。

感謝,

邁克

回答

6

我認爲這是你在找什麼:

scala> import play.api.libs.json._ 
import play.api.libs.json._ 

scala> case class Credentials(awsAccountName: String, accessKey: String, secretKey: String) 
defined class Credentials 

scala> implicit val credentialsFmt = Json.format[Credentials] 
credentialsFmt: play.api.libs.json.OFormat[Credentials] = [email protected] 

scala> val js = """[{"awsAccountName":"mslinn","accessKey":"blahblah","secretKey":"blahblah"}]""" 
js: String = [{"awsAccountName":"mslinn","accessKey":"blahblah","secretKey":"blahblah"}] 

scala> Json.fromJson[Seq[Credentials]](Json.parse(js)) 
res3: play.api.libs.json.JsResult[Seq[Credentials]] = JsSuccess(List(Credentials(mslinn,blahblah,blahblah)),) 

HTH,

朱利安

+0

你做它似乎太容易了: ) –