为泛型类型的 Seq 获取 Json 格式

Get a Json format for a Seq of a generic type

我有一个带有通用类型的抽象 class,它从其子class 中获取该通用类型的 Json 格式。但是抽象 class 还需要该类型序列的 Json 格式。在 Scala 中有什么方法可以仅根据这些事物的格式来获得一系列事物的 Json 格式?

我正在使用 Play Json 框架。

这里有一个示例,它不完全符合我的情况,但很好地说明了我想要实现的目标:

  package scalatest

  import scala.concurrent.Future
  import scala.concurrent.ExecutionContext.Implicits.global
  import scala.concurrent.Await
  import scala.concurrent.duration.Duration
  import java.util.UUID
  import scala.util.control.NonFatal
  import play.api.libs.json.Format
  import play.api.libs.json.Json

  object Banana {

     def main(args: Array[String]): Unit = {
        val f: Format[Seq[Banana]] = getSeqFormat(Json.format[Banana])
     }

     def getSeqFormat[T](format: Format[T]): Format[Seq[T]] = {
        ??? // TODO implement
     }
  }

  case class Banana(color: String)

如果您只是想将香蕉序列化为 JSON 对象,那么您唯一需要做的就是定义 Banana implicit json 格式,其他格式(例如 Seq 格式)内置于 play:

import play.api.libs.json.Json

case class Banana(color: String)
object Banana {
  implicit val jsonFormat = Json.writes[Banana]
}

object PlayJsonTest extends App {
  val bananas = Seq(Banana("yellow"), Banana("green"))
  println(Json.toJson(bananas)) // [{"color":"yellow"},{"color":"green"}]
}

这也适用于其他类型,因为 Json#toJson 方法定义如下:

// Give me an implicit `Writes[T]` and I know how to serialize it
def toJson[T](o: T)(implicit tjs: Writes[T]): JsValue = tjs.writes(o)

隐式使用默认值,其中包括大多数集合的格式。你可以找到它们 here.

希望对你有帮助。