![](/img/trans.png)
[英]JsonProperty annotation does not work for Json parsing in Scala (Jackson/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.