使用 Jerkson,我能够解析包含 JSON 数组的字符串,如下所示:
com.codahale.jerkson.Json.parse[Array[Credentials]](contents)
其中 contents 是一个包含以下内容的字符串:
[{"awsAccountName":"mslinn","accessKey":"blahblah","secretKey":"blahblah"}]
...我会得到一系列凭证。
(简短的转移)我尝试使用新的 JSON 解析器为 Play 2.1 和 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 的名为 contents 的原始字符串。与所有集合一样,对象数组没有 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 的精神背道而驰。理想的咒语会像杰克森的咒语一样简单。
谢谢,
麦克风