首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >玩2.1 Scala JSON解析比Jerkson难吗?

玩2.1 Scala JSON解析比Jerkson难吗?
EN

Stack Overflow用户
提问于 2013-05-20 12:15:11
回答 1查看 2.3K关注 0票数 0

使用Jerkson,我能够解析包含JSON数组的字符串,如下所示:

代码语言:javascript
复制
com.codahale.jerkson.Json.parse[Array[Credentials]](contents)

其中,contents是包含以下内容的字符串:

代码语言:javascript
复制
[{"awsAccountName":"mslinn","accessKey":"blahblah","secretKey":"blahblah"}]

..。然后我会得到证书数组。

(简要介绍)我尝试使用Play 2.1的新JSON解析器和使用不同数据的Scala来做类似的事情。对于简单的解析,下面的方法可以很好地工作。case类(S3File)定义了执行此操作所需的unapply方法:

代码语言:javascript
复制
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

让我们重新考虑名为contents的原始字符串,该字符串包含JSON。与所有集合一样,对象数组没有unapply方法。这意味着我在上面的转换中展示的技术将不起作用。为此,我尝试创建了一个一次性用例类:

代码语言:javascript
复制
case class ArrayCreds(payload: Array[Credentials])

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

..。不幸的是,这失败了:

代码语言:javascript
复制
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数组的简单方法?我预计一次性用例类是错误的方法,而隐式方法需要改为:

代码语言:javascript
复制
implicit val credsFormat = Json.format[Credentials]

但是我不知道如何以一种简单的方式编写其余的反序列化。我看到的所有代码示例都相当冗长,这似乎与Scala的精神背道而驰。理想的咒语应该和杰克森的咒语一样简单。

谢谢,

麦克

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2013-05-20 15:30:07

我想这就是你要找的:

代码语言:javascript
复制
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,

朱利安

票数 6
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/16642505

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档