1
のJsonWriterまたはJsonFormatタイプクラスが見つかりません
私はhttpリクエストを配置したクラスを持っています。これは私がjsonが必要な場所です。スプレーJson:
package com.webtrekk.cometd
import com.webtrekk.json._
import spray.json._
import scala.concurrent.Future
import scala.concurrent.duration._
import akka.util.Timeout
import akka.pattern.ask
import akka.io.IO
import spray.can.Http
import scala.util.{ Success, Failure }
import akka.actor.ActorSystem
import spray.http._
import HttpMethods._
import spray.http.HttpHeaders._
import spray.http.ContentTypes._
import spray.http.MediaTypes._
import scala.concurrent.Future
class Handshake(var url:String, var token:String){
val handshake = com.webtrekk.json.Handshake
implicit val system: ActorSystem = ActorSystem("salesforce")
implicit val timeout: Timeout = Timeout(15.seconds)
def execute() {
val contentType = new ContentType(MediaTypes.`application/json`, Option(HttpCharsets.`UTF-8`))
val httpHeader = List(RawHeader("Authorization", "Bearer "+token))
val httpEntity = HttpEntity(
contentType,
handshake.toJson)
val responseFuture: Future[HttpResponse] =
(IO(Http) ? HttpRequest(
method = POST,
uri = url,
entity = httpEntity,
headers = httpHeader)).mapTo[HttpResponse]
}
}
そして、ここでハンドシェイクJSONプロトコル
package com.webtrekk.json
import spray.json._
import DefaultJsonProtocol._
class Handshake(
val channel: String = "/meta/handshake",
val id: Int = 1,
val supportedConnectionTypes: Vector[String] = Vector("long-polling"),
val version: String = "1.0",
val minimumVersion: String = "1.0") {
var successful: Boolean = false
var clientId:String = ""
}
class HandshakeProtocol extends DefaultJsonProtocol {
implicit object HandshakeJsonFormat extends JsonFormat[Handshake] {
def write(h: Handshake): JsValue =
JsObject(
"channel" -> JsString(h.channel),
"id" -> JsNumber(h.id),
"supportedConnectionTypes" -> JsArray(h.supportedConnectionTypes.map(value => JsString(value))),
"version" -> JsString(h.version),
"minimumVersion" -> JsString(h.minimumVersion)
)
def read(value: JsValue): Handshake =
value.asJsObject.getFields(
"channel",
"id",
"supportedConnectionTypes",
"version",
"minimumVersion",
"successful",
"cliendId"
) match {
case Seq(
JsString(channel),
JsNumber(id),
JsArray(supportedConnectionTypes),
JsString(version),
JsString(minimumVersion),
JsBoolean(successful),
JsString(clientId)
) => {
var handshake = new Handshake(
channel,
id.toInt,
supportedConnectionTypes.map(value => value.toString),
version,
minimumVersion)
handshake.successful = successful
handshake.clientId = clientId
handshake
}
case _ => throw new DeserializationException("JSON Error: Handshake Json Structure isn't correct!")
}
}
}
私もRootJsonFormatを拡張しました。しかし、これもうまくいきません。 なぜtoJsonメソッドが動作しないのかわかりません。私はスカラ座2.11.7
あなたが書いた含意は、あなたが 'toJson'を呼んでいる範囲にはないでしょう。それらを直接インポートするか、 'Handshake'のコンパニオンオブジェクトに追加する必要があります。 – tryx
オブジェクトに追加するとどういう意味ですか?拡張? –
私はそれを持っています:暗黙のval handshakeFormat = HandshakeJsonFormatをハンドシェイククラスに追加しました。そして、私はHandshakeJsonFormatオブジェクトの外部クラスHandshakeProtocolを削除しました。 –