【问题标题】:JSON serializer with json4s on phantom-dsl Collection columnphantom-dsl Collection 列上带有 json4s 的 JSON 序列化程序
【发布时间】:2016-03-19 01:51:11
【问题描述】:

一直在关注需要json序列化器的集合column tutorial for phantom-dsl

下面的实现得到以下错误输出;

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

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

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

[错误] 紧凑(渲染(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)
    }
  }

【问题讨论】:

    标签: json serialization cassandra json4s phantom-dsl


    【解决方案1】:

    我认为您的问题是 compact(render(obj)) 调用未按预期工作。幻像示例基于 lift-json 库,其中该确切的方法调用会生成一个字符串。

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2016-05-12
      • 1970-01-01
      • 2017-05-19
      • 1970-01-01
      • 2014-09-16
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多