喷涂json-shapedless密封特性格式化器的麻烦

时间:2016-07-05 23:19:02

标签: scala spray shapeless spray-json

此问题特定于使用spray-json-shapeless。 我尝试做类似的事情(至少从我看到的)到scalatests for sjs的第一次单元测试。根据测试,密封特征SimpleTrait及其实现在包中定义并且格式化器被实现"在另一个包中。我实际上并没有看到SimpleTrait的格式化程序 implicit val SimpleTraitFormat: RootJsonFormat[SimpleTrait] = cachedImplicit 这让我相信实际的隐式格式化程序来自隐式范围。从我的理解,这是什么喷雾json-shapedless提供,一个默认的json marshaller密封特征及其实现。

我尝试做类似的事情,但我的单元测试抱怨说它找不到我的类型的JsonFormat。

在包core中,我定义了我的域数据。

package core

sealed trait ModuleInfo
case class SerialNumber( moduleSerial: String ) extends ModuleInfo
case class ColorCalibration( calibrationR: Double,
                             calibrationG: Double,
                             calibrationB: Double ) extends ModuleInfo
case class LensDistortion( distortionX: Double,
                           distortionY: Double,
                           distortionD: Double ) extends ModuleInfo

在包api中,我定义了格式化程序对象的开头

package api

import fommil.sjs._
import spray.json._
import shapeless._

object Formatters extends DefaultJsonProtocol with FamilyFormats {
  import core._
  implicit val ModuleInfoFormat: RootJsonFormat[ ModuleInfo ] = cachedImplicit
}

然后我尝试在api包中编写单元测试(没有实际测试,只是一个println来查看它是否编译并找到必要的隐含)。

package api

import org.scalatest.{Matchers, FlatSpecLike}
import spray.json._
/**
  * Created by kartik on 6/30/16.
  */
class FormatterSpec extends FlatSpecLike with Matchers {

  "A Serial Number" should  "serialize to json" in {
    import core._
    import Formatters._

    println( SerialNumber( "SomeSerial" ).toJson )
  }
}

这导致编译器错误,说

  

错误:(22,65)无法找到类型的隐式值   用于缓存隐式val的spray.json.RootJsonFormat [core.ModuleInfo]   ModuleInfoFormat:RootJsonFormat [ModuleInfo] = cachedImplicit

我的理解错了吗?应该为ModuleInfo提供一个实际的JsonFormatter? SimpleTrait从哪里获取格式化程序?

提前致谢。

0 个答案:

没有答案