如何 encode/decode 圈中的 json 时间戳?
How to encode/decode Timestamp for json in circe?
在 slick 中使用 circe 获取 json 中的数据时,我可以获取实体中没有日期 (Timestamp/DateTime)
字段的数据。但是当我在实体中使用 Timestamp
字段时,会抛出错误:
[error] /var/www/html/scala-api/src/main/scala/oc/api/http/routes/TestApi.scala:40: could not find implicit value for parameter encoder: io.circe.Encoder[Seq[oc.api.models.UserEntity]]
[error] auth => complete(userDao.getAll().map(_.asJson))
这是代码,我用于 Slick Entities 并使用 CIRCE 进行 json 编码。
基表:
abstract class BaseTable[T](tag: Tag, name: String) extends Table[T](tag, name) {
def id = column[Long]("id", O.PrimaryKey, O.AutoInc)
def createdAt = column[Timestamp]("created_at")
def updatedAt = column[Timestamp]("updated_at")
def deletedAt = column[Timestamp]("deleted_at")
}
基础实体:
trait BaseEntity {
val id : Long
def isValid : Boolean = true
}
UserEntity: createdAt 生成编码器错误
case class UserEntity(id: Long, email: String, password: String, createdAt: Timestamp) extends BaseEntity
UserEntity:这非常有效
case class UserEntity(id: Long, email: String, password: String) extends BaseEntity
用户表(流畅):
object UserTables {
class UserTable(tag : Tag) extends BaseTable[UserEntity](tag, "users") {
def name = column[String]("name")
def password = column[String]("password")
def * = (id, name, password) <> (UserEntity.tupled, UserEntity.unapply)
}
implicit val accountsTableQ : TableQuery[UserTable] = TableQuery[UserTable]
}
我在代码中遗漏了什么吗?任何帮助将不胜感激。
您应该对您的代码使用自定义编码器和解码器,例如:
implicit val TimestampFormat : Encoder[Timestamp] with Decoder[Timestamp] = new Encoder[Timestamp] with Decoder[Timestamp] {
override def apply(a: Timestamp): Json = Encoder.encodeLong.apply(a.getTime)
override def apply(c: HCursor): Result[Timestamp] = Decoder.decodeLong.map(s => new Timestamp(s)).apply(c)
}
将此 val 放入 encode/decode 时间戳所需的任何代码中。比如可以放在一个对象中,在需要的地方导入对象。
在 slick 中使用 circe 获取 json 中的数据时,我可以获取实体中没有日期 (Timestamp/DateTime)
字段的数据。但是当我在实体中使用 Timestamp
字段时,会抛出错误:
[error] /var/www/html/scala-api/src/main/scala/oc/api/http/routes/TestApi.scala:40: could not find implicit value for parameter encoder: io.circe.Encoder[Seq[oc.api.models.UserEntity]]
[error] auth => complete(userDao.getAll().map(_.asJson))
这是代码,我用于 Slick Entities 并使用 CIRCE 进行 json 编码。
基表:
abstract class BaseTable[T](tag: Tag, name: String) extends Table[T](tag, name) {
def id = column[Long]("id", O.PrimaryKey, O.AutoInc)
def createdAt = column[Timestamp]("created_at")
def updatedAt = column[Timestamp]("updated_at")
def deletedAt = column[Timestamp]("deleted_at")
}
基础实体:
trait BaseEntity {
val id : Long
def isValid : Boolean = true
}
UserEntity: createdAt 生成编码器错误
case class UserEntity(id: Long, email: String, password: String, createdAt: Timestamp) extends BaseEntity
UserEntity:这非常有效
case class UserEntity(id: Long, email: String, password: String) extends BaseEntity
用户表(流畅):
object UserTables {
class UserTable(tag : Tag) extends BaseTable[UserEntity](tag, "users") {
def name = column[String]("name")
def password = column[String]("password")
def * = (id, name, password) <> (UserEntity.tupled, UserEntity.unapply)
}
implicit val accountsTableQ : TableQuery[UserTable] = TableQuery[UserTable]
}
我在代码中遗漏了什么吗?任何帮助将不胜感激。
您应该对您的代码使用自定义编码器和解码器,例如:
implicit val TimestampFormat : Encoder[Timestamp] with Decoder[Timestamp] = new Encoder[Timestamp] with Decoder[Timestamp] {
override def apply(a: Timestamp): Json = Encoder.encodeLong.apply(a.getTime)
override def apply(c: HCursor): Result[Timestamp] = Decoder.decodeLong.map(s => new Timestamp(s)).apply(c)
}
将此 val 放入 encode/decode 时间戳所需的任何代码中。比如可以放在一个对象中,在需要的地方导入对象。