2016-04-03 43 views
1

我有我的课,我放置了http请求。这是我需要一个JSON的地方。Spray Json:找不到JsonWriter或JsonFormat类型

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方法不起作用。在执行我的错误:无法找到JsonWriter或JsonFormat型类Handshake.this.handshake.type

我使用Scala的2.11.7

+1

你写的含义不会在你调用'toJson'的范围内。您需要直接导入它们或将它们添加到'Handshake'的伴随对象。 – tryx

+0

你对添加到对象意味着什么?扩展? –

+0

好的:我拥有它:添加隐式val handshakeFormat = HandshakeJsonFormat到握手类。我删除了HandshakeJsonFormat对象的外部类HandshakeProtocol。 –

回答

1

我加入

implicit val handshakeFormat = HandshakeJsonFormat 

到握手类。这工作。由此,HandhshakeJsonFormat处于握手范围内。感谢tryx