此问题特定于使用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
从哪里获取格式化程序?
提前致谢。