Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/json/15.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
玩2.1 Scala JSON解析比杰克森更难?_Json_Scala_Playframework - Fatal编程技术网

玩2.1 Scala JSON解析比杰克森更难?

玩2.1 Scala JSON解析比杰克森更难?,json,scala,playframework,Json,Scala,Playframework,通过Jerkson,我能够解析包含JSON数组的字符串,如下所示: com.codahale.jerkson.Json.parse[Array[Credentials]](contents) 其中内容是包含以下内容的字符串: [{"awsAccountName":"mslinn","accessKey":"blahblah","secretKey":"blahblah"}] 。。。我会得到一系列的证书 (简短的转移)我尝试使用Play2.1的新JSON解析器和使用不同数据的Scala做类似的

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

com.codahale.jerkson.Json.parse[Array[Credentials]](contents)
其中内容是包含以下内容的字符串:

[{"awsAccountName":"mslinn","accessKey":"blahblah","secretKey":"blahblah"}]
。。。我会得到一系列的证书

(简短的转移)我尝试使用Play2.1的新JSON解析器和使用不同数据的Scala做类似的事情。对于一个简单的解析,下面的方法很好。case类(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
让我们重新考虑名为contents containing 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]                                      ^
有没有一种简单的方法可以使用Play2.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)),)
嗯,


朱利安我想这就是你想要的:

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)),)
嗯,


朱利安

你让它看起来太容易了:)你让它看起来太容易了:)