2016-03-19 12 views
0

json serializer gerektiren column tutorial for phantom-dsl koleksiyonunu takip etmektesiniz.phantom-dsl üzerinde json4s ile JSON serializer Koleksiyon sütun

Aşağıdaki uygulama aşağıdaki hata çıktısını alıyor;

Bulunan: org.dyne.danielsan.superchain.data.models.JsonVin

[hata] gereklidir: org.json4s.JValue

(genişler) [hata] org.json4s .JsonAST.JValue

[hata] kompakt (render (obj))

ben çok takdir, yanlış gidiyorum işaret herhangi bir yardım. Sorun AFAIK fantom-dsl tanımlanacak özel tipini gerektirdiğini, ancak json4s bir 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 

} 

Düzeltme bekliyor: yorum için

Teşekkür Flavian. Haklısın. Sonunda bu Json4s ile çalışmak için gerekli olan, bir:

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) 
    } 
    } 

cevap

0

Ben senin sorunun beklendiği gibi compact(render(obj)) aramalar çalışmıyor olduğunu düşünüyorum. Fantom örnekleri, bu yöntem çağrısının bir dize oluşturduğu lift-json kitaplığına dayanır.

Büyük olasılıkla, render() yöntem JValue beklediğini, bu nedenle yapmanız gereken compact(render()) çağırmadan önce bir JsonVin bir JValue üretmektir. Farklı türde nesneler için render yöntemi olması gereken import org.json4s.JsonDSL._ içe aktarma işleminden kurtulabilirsiniz. Ek olarak, Jackson serileştiricisi ile çalışırken, here açıklandığı gibi, özel serileştiriciler sağlamanız gerekebilir gibi görünüyor. Yapabiliyorsanız, ekstra adımlara ihtiyaç duymayan doğal olanı kullanın.

İlgili konular