2016-03-19 14 views
0

jsonシリアライザが必要なコレクションcolumn tutorial for phantom-dslに続いています。JSONシリアライザ、json4s with phantom-dslコレクションコラム

以下の実装では、次のエラー出力が表示されています。 org.dyne.danielsan.superchain.data.models.JsonVin

[エラー]必須:org.json4s.JValue

[エラー](の拡大)org.json4sを発見

.JsonAST.JValue

[エラー]コンパクト((OBJ)レンダリング)

私が間違っているつもり場所を指しているすべてのヘルプ、感謝。問題は、私の知る限りファントム-DSLを定義するカスタム型を必要とすることであるが、JValue ...

import com.websudos.phantom.CassandraTable 
import com.websudos.phantom.dsl._ 
import org.json4s.{NoTypeHints, _} 
import org.json4s.jackson.JsonMethods._ 
import org.json4s.jackson.Serialization 

case class Transaction(blockhash: String, 
         blocktime: Long, 
         confirmations: Int, 
         vout: List[Vout], 
         vin: List[Vin]) 

case class JsonVout(value: String, 
        n: String, 
        scriptPubKey: String) 

case class JsonVin(coinbase: String, 
        sequence: String) 

sealed class TransactionColumnFamily extends CassandraTable[TransactionColumnFamily, Transaction] { 

    implicit val formats = Serialization.formats(NoTypeHints) 

    override def fromRow(row: Row): Transaction = { 
    Transaction(
     blockhash(row), 
     blocktime(row), 
     confirmations(row), 
     vout(row), 
     vin(row) 
    ) 
    } 

    object blockhash extends StringColumn(this) with PartitionKey[String] 

    object blocktime extends LongColumn(this) with ClusteringOrder[Long] with Descending 

    object confirmations extends IntColumn(this) with ClusteringOrder[Int] with Descending 

    object vout extends JsonListColumn[TransactionColumnFamily, Transaction, Vout](this) { 
    override def fromJson(obj: String): Vout = { 
     parse(obj).extract[Vout] 
    } 

//This is where the first error arises 

    override def toJson(obj: Vout): String = { 
     compact(render(obj)) 
    } 
    } 

    object vin extends JsonListColumn[TransactionColumnFamily, Transaction, Vin](this) { 
    override def fromJson(obj: String): Vin = { 
     parse(obj).extract[Vin] 
    } 

//This is where the second error arises 

    override def toJson(obj: JsonVin): String = { 
     compact(render(obj)) 
    } 
    } 

} 

object TransactionColumnFamily extends TransactionColumnFamily with RootConnector { 
    // some more stuff 
    // some more stuff 

} 

修正 json4s期待している:コメントを

おかげフラウィウスを。あなたは正しいです。最後に、これはJson4sでの作業のために必要だったものです。

object vout extends JsonListColumn[TransactionColumnFamily, Transaction, Vout](this) { 
    override def fromJson(obj: String): Vout = { 
     parse(obj).extract[Vout] 
    } 

    override def toJson(obj: Vout): String = { 
     write(obj) 
    } 
    } 

    object vin extends JsonListColumn[TransactionColumnFamily, Transaction, Vin](this) { 
    override def fromJson(obj: String): Vin = { 
     parse(obj).extract[Vin] 
    } 

    override def toJson(obj: Vin): String = { 
     write(obj) 
    } 
    } 

答えて

0

私はあなたの問題は予想通りcompact(render(obj))呼び出しが動作していないということだと思います。ファントムの例は、正確なメソッド呼び出しが文字列を生成するlift-jsonライブラリに基づいています。

はほとんどの場合、あなたのrender()方法はJValueを期待するので、あなたは何をする必要があるかcompact(render())を呼び出す前にJsonVinからJValueを生成することです。さまざまな種類のオブジェクトに対してのインポート方法がある場合は、renderメソッドをインポートする必要があります。

また、Jacksonシリアライザを使用する場合は、hereのようにカスタムシリアライザを用意する必要があるようです。可能であれば、余分なステップを必要としないネイティブのものを使用してください。