喷涂JSON格式和转换错误

时间:2018-01-11 11:55:43

标签: scala spray-json

我有一个特性,我想为它编写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")

1 个答案:

答案 0 :(得分:1)

您的DefaultMessage使用org.joda.time.DateTime并且spray-json不知道如何将其开箱即用/反序列化。

因此,您需要定义RootJsonFormat[DateTime]并将其置于隐式范围内。

Here是一个示例实现。