无法使用 spray-json 解组 json HttpEntity
Posted
技术标签:
【中文标题】无法使用 spray-json 解组 json HttpEntity【英文标题】:Can't unmarshall json HttpEntity with spray-json 【发布时间】:2015-09-26 01:53:17 【问题描述】:我正在尝试仅运行 documentation 中的简单示例而不进行任何更改:
import spray.json.DefaultJsonProtocol
import spray.httpx.unmarshalling._
import spray.httpx.marshalling._
import spray.http._
import HttpCharsets._
import MediaTypes._
case class Person(name: String, firstName: String, age: Int)
object MyJsonProtocol extends DefaultJsonProtocol
implicit val PersonFormat = jsonFormat3(Person)
import MyJsonProtocol._
import spray.httpx.SprayJsonSupport._
import spray.util._
val bob = Person("Bob", "Parr", 32)
val body = HttpEntity(
contentType = ContentType(`application/json`, `UTF-8`),
string =
"""|
| "name": "Bob",
| "firstName": "Parr",
| "age": 32
|""".stripMarginWithNewline("\n")
)
marshal(bob)
body.as[Person]
它在最后一行 ("body.as[Person]") 失败,出现以下错误和堆栈跟踪:
Exception in thread "main" java.lang.NoSuchMethodError: spray.json.JsonParser$.apply(Ljava/lang/String;)Lspray/json/JsValue;
at spray.httpx.SprayJsonSupport$$anonfun$sprayJsonUnmarshaller$1.applyOrElse(SprayJsonSupport.scala:36)
at spray.httpx.SprayJsonSupport$$anonfun$sprayJsonUnmarshaller$1.applyOrElse(SprayJsonSupport.scala:34)
at scala.runtime.AbstractPartialFunction.apply(AbstractPartialFunction.scala:36)
at spray.httpx.unmarshalling.Unmarshaller$$anon$1$$anonfun$unmarshal$1.apply(Unmarshaller.scala:29)
at spray.httpx.unmarshalling.SimpleUnmarshaller.protect(SimpleUnmarshaller.scala:40)
at spray.httpx.unmarshalling.Unmarshaller$$anon$1.unmarshal(Unmarshaller.scala:29)
at spray.httpx.unmarshalling.SimpleUnmarshaller.apply(SimpleUnmarshaller.scala:29)
at spray.httpx.unmarshalling.SimpleUnmarshaller.apply(SimpleUnmarshaller.scala:23)
at spray.httpx.unmarshalling.package$PimpedHttpEntity.as(package.scala:39)
at com.example.M1$.delayedEndpoint$com$example$M1$1(M1.scala:34)
at com.example.M1$delayedInit$body.apply(M1.scala:3)
at scala.Function0$class.apply$mcV$sp(Function0.scala:34)
at scala.runtime.AbstractFunction0.apply$mcV$sp(AbstractFunction0.scala:12)
at scala.App$$anonfun$main$1.apply(App.scala:76)
at scala.App$$anonfun$main$1.apply(App.scala:76)
at scala.collection.immutable.List.foreach(List.scala:381)
at scala.collection.generic.TraversableForwarder$class.foreach(TraversableForwarder.scala:35)
at scala.App$class.main(App.scala:76)
at com.example.M1$.main(M1.scala:3)
at com.example.M1.main(M1.scala)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
at java.lang.reflect.Method.invoke(Method.java:497)
at com.intellij.rt.execution.application.AppMain.main(AppMain.java:140)
我的代码有什么问题?我的依赖项如下(build.sbt):
scalaVersion := "2.11.7"
libraryDependencies ++= Seq(
"io.spray" %% "spray-can" % "1.3.1",
"io.spray" %% "spray-routing" % "1.3.1",
"io.spray" %% "spray-json" % "1.3.2",
"com.typesafe.akka" %% "akka-actor" % "2.3.11"
)
我发现了一个 bug 与 spray-httpx 和 spray-json 之间的不兼容有关,但似乎已经解决了。我正在使用所有库的最新稳定版本。
还有什么问题?
【问题讨论】:
这似乎是版本的问题......为什么您将 1.3.1 用于 span-can、spray-routing 和 1.3.2 用于 spray-json? 顺便说一句。你为什么认为 1.3.1 是最新版本?我们遇到了几个这样的问题,所以也许有一个旧的来源可以解决这个问题? (首先,我们应该确保不破坏兼容性,但不幸的是我们混淆了) 我以为1.3.1是最新版本,因为我用mvnrepository.com搜索。 :) 检查这个mvnrepository.com/artifact/io.spray/spray-can/1.3.1 那是我的错误。会知道搜索 java/scala 的依赖库不是最佳选择。 【参考方案1】:看起来像spray-http和spray-json之间的版本不兼容问题,这些特定版本运行良好,没有任何问题:
libraryDependencies ++= Seq(
"io.spray" %% "spray-can" % "1.3.3",
"io.spray" %% "spray-routing" % "1.3.3",
"io.spray" %% "spray-json" % "1.3.2",
"com.typesafe.akka" %% "akka-actor" % "2.3.11"
)
【讨论】:
真的非常感谢!这就是我头痛的原因! :) 我选择 1.3.1 版本的 spray-can 和 spray-routing 的原因——这是 mvnrepository.com 的搜索引擎给我的最新版本。再也不会信任这个网站了。 :)以上是关于无法使用 spray-json 解组 json HttpEntity的主要内容,如果未能解决你的问题,请参考以下文章
json:无法将字符串解组为 MyMap.map 类型的 Go 值