簡體   English   中英

玩2.1 Scala JSON解析比Jerkson難嗎?

[英]Play 2.1 Scala JSON parsing harder than Jerkson?

使用Jerkson,我能夠解析包含JSON數組的String,如下所示:

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

其中content是一個包含以下內容的字符串:

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

...,我將獲得一組憑證。

(簡要說明)我嘗試使用適用於Play 2.1的新JSON解析器和使用不同數據的Scala進行類似的操作。 對於一個簡單的分析,以下工作正常。 案例類(S3File)定義了此方法起作用所需的unapply方法:

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。 與所有集合一樣,對象數組也沒有unapply方法。 這意味着我在上面的轉移中展示的技術將不起作用。 為此,我嘗試創建一個一次性案例類:

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]                                      ^

是否有使用Play 2.1的新JSON解析器解析JSON數組的簡單方法? 我希望一次性案例類是錯誤的方法,而隱式將需要改為:

implicit val credsFormat = Json.format[Credentials]

但是我不明白如何以簡單的方式編寫其余的反序列化。 我看到的所有代碼示例都相當冗長,這似乎與Scala的精神背道而馳。 理想的咒語就像傑克森的咒語一樣簡單。

謝謝,

麥克風

我認為這是您要尋找的:

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] = play.api.libs.json.OFormat$$anon$1@1da9be95

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,

朱利安

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM