JSON 在 phantom-dsl Collection 列上使用 json4s 的序列化程序
JSON serializer with json4s on phantom-dsl Collection column
一直在关注 collection column tutorial for phantom-dsl,它需要 json 序列化程序。
下面的实现得到以下错误输出;
found : org.dyne.danielsan.superchain.data.models.JsonVin
[error] required: org.json4s.JValue
[error] (which expands to) org.json4s.JsonAST.JValue
[error] compact(render(obj))
任何帮助指出我出错的地方,非常感谢。问题是 AFAIK phantom-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))
调用未按预期工作。虚幻示例基于 lift-json
库,其中确切的方法调用会生成一个字符串。
很可能,您的 render()
方法需要 JValue
,因此您需要做的是在调用 [=16] 之前从 JsonVin
生成 JValue
=].你可能会逃避导入 import org.json4s.JsonDSL._
,其中应该有一个 render
方法用于不同类型的对象。
此外,在使用 Jackson 序列化程序时,您似乎可能需要提供自定义序列化程序,如 here 所述。如果可以的话,就用原生的吧,不需要额外的步骤。
一直在关注 collection column tutorial for phantom-dsl,它需要 json 序列化程序。
下面的实现得到以下错误输出;
found : org.dyne.danielsan.superchain.data.models.JsonVin
[error] required: org.json4s.JValue
[error] (which expands to) org.json4s.JsonAST.JValue
[error] compact(render(obj))
任何帮助指出我出错的地方,非常感谢。问题是 AFAIK phantom-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))
调用未按预期工作。虚幻示例基于 lift-json
库,其中确切的方法调用会生成一个字符串。
很可能,您的 render()
方法需要 JValue
,因此您需要做的是在调用 [=16] 之前从 JsonVin
生成 JValue
=].你可能会逃避导入 import org.json4s.JsonDSL._
,其中应该有一个 render
方法用于不同类型的对象。
此外,在使用 Jackson 序列化程序时,您似乎可能需要提供自定义序列化程序,如 here 所述。如果可以的话,就用原生的吧,不需要额外的步骤。