幻影dsl集合列上带有json4s的JSON序列化程序

幻影dsl集合列上带有json4s的JSON序列化程序,json,serialization,cassandra,json4s,phantom-dsl,Json,Serialization,Cassandra,Json4s,Phantom Dsl,一直在跟踪需要json序列化程序的集合 下面的实现将获得以下错误输出 找到:org.dyne.danielsan.superchain.data.models.JsonVin [错误]必需:org.json4s.JValue [错误](扩展为)org.json4s.JsonAST.JValue [错误]压缩(渲染(obj)) 如果有人能帮我指出哪里出了问题,我将不胜感激。问题是AFAIK幻影dsl需要定义自定义类型,但json4s需要一个JValue import com.websudos.ph

一直在跟踪需要json序列化程序的集合

下面的实现将获得以下错误输出

找到:org.dyne.danielsan.superchain.data.models.JsonVin

[错误]必需:org.json4s.JValue

[错误](扩展为)org.json4s.JsonAST.JValue

[错误]压缩(渲染(obj))

如果有人能帮我指出哪里出了问题,我将不胜感激。问题是AFAIK幻影dsl需要定义自定义类型,但json4s需要一个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所需要的:

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

我认为您的问题在于
compact(render(obj))
调用没有按预期工作。幻影示例基于
liftJSON
库,在该库中,精确的方法调用生成一个字符串

很可能,您的
render()
方法需要一个
JValue
,因此您需要做的是在调用
compact(render())
之前从
JsonVin
生成一个
JValue
。您可以导入
import org.json4s.JsonDSL.\u
,其中应该有一个针对不同类型对象的
render
方法

此外,在使用Jackson序列化程序时,您可能需要提供自定义序列化程序,如下所述。如果可以的话,只需使用本机的,不需要额外的步骤