我有一个特性,我想为它编写Typeclasses。这个特性实际上是一个将JSON转换为Case类转换的契约,反之亦然。特征的定义如下:
<application
android:name="com.bambulabs.codebase.Models.Global"
android:hardwareAccelerated="false"
android:icon="@mipmap/ic_launcher"
android:label="@string/app_name"
android:largeHeap="true"
android:logo="@mipmap/ic_launcher"
android:theme="@style/MyMaterialTheme"
tools:replace="android:icon"
android:launchMode="singleInstance">
<activity
android:name="com.bambulabs.codebase.ActivityA"
android:configChanges="locale"
android:label="@string/app_name"
android:screenOrientation="sensorPortrait"
android:launchMode="singleTop">
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<action android:name="android.net.wifi.WIFI_STATE_CHANGED"/>
<action android:name="android.net.wifi.SCAN_RESULTS"/>
<category android:name="android.intent.category.DEFAULT"/>
<category android:name="android.intent.category.LAUNCHER" />
<category android:name="android.intent.category.HOME" />
</intent-filter>
</activity>
<activity
android:name="com.bambulabs.codebase.ActivityB"
android:configChanges="locale"
android:label="@string/app_name"
android:screenOrientation="sensorPortrait">
</activity>
<activity
android:name="com.bambulabs.codebase.ActivityC"
android:configChanges="locale"
android:label="@string/app_name"
android:screenOrientation="sensorPortrait">
</activity>
</application>
现在,对于我所拥有的一个案例类,我已经定义了这样的实现:
trait Converter[T] {
def convertFromJson(msg: String): Either[ConverterError, T]
def convertToJson(msg: T): String
}
但是当我尝试构建项目时遇到了一些编译器错误。我不确定我做错了什么?
object Converter extends DefaultJsonProtocol {
implicit object DefaultMessageConversions extends Converter[DefaultMessage] {
implicit val json = jsonFormat(DefaultMessage, "timestamp")
def convertFromJson(msg: String): Either[ConverterError, DefaultMessage] = {
try {
Right(msg.parseJson.convertTo[DefaultMessage])
}
catch {
case _: Exception => Left(ConverterError("Shit happens"))
}
}
def convertToJson(msg: DefaultMessage) = {
implicit val writes = Json.writes[DefaultMessage]
Json.toJson(msg).toString
}
}
def apply[T: Converter] : Converter[T] = implicitly
}
以下是我的案例类的样子:
[error] /Users/joesan/ingestion/src/main/scala/com/my/project/common/JsonMessageConversion.scala:28: could not find implicit value for evidence parameter of type com.my.project.common.JsonMessageConversion.Converter.JF[org.joda.time.DateTime]
[error] implicit val json = jsonFormat(DefaultMessage, "timestamp")
答案 0 :(得分:1)
您的DefaultMessage
使用org.joda.time.DateTime
并且spray-json不知道如何将其开箱即用/反序列化。
因此,您需要定义RootJsonFormat[DateTime]
并将其置于隐式范围内。
Here是一个示例实现。