为Scup的Seq播放Scala Json作家

use*_*010 4 json scala playframework

我正在尝试找到一种方法来使用内置的Macro Json Writer来序列化Seq [(String,Customer)]

我设法为Seq [Customer]做了这个,但是当添加touple时,编译器开始尖叫我.

此代码有效:

package models.health

import play.api.libs.json._

case class Customer(name: String, age: Int)

//we use the dummy var as a workaround to the json writer    limitations (cannot handle single argument case class)
case class Demo(customers: Seq[Customer], dummy: Option[String] =    None)

object Demo {

 import play.api.libs.functional.syntax._

 implicit val customer_writer = Json.writes[Customer]

 implicit val writes: Writes[Demo] = (
 (__ \ "customers").write[Seq[Customer]] and
 (__ \ "dummy").writeNullable[String]) { 
    (d: Demo) => (d.customers,d.dummy)
 }

}
Run Code Online (Sandbox Code Playgroud)

但是下面的代码(只需从Seq [Customer]更改为Seq [(String,Customer)]不会Copmile ...真的很感激任何帮助:

package models.health

import play.api.libs.json._

case class Customer(name: String, age: Int)

//we use the dummy var as a workaround to the json writer    limitations (cannot handle single argument case class)
case class Demo(customers: Seq[(String,Customer], dummy: Option[String] =    None)

object Demo {

 import play.api.libs.functional.syntax._

 implicit val customer_writer = Json.writes[Customer]

 implicit val writes: Writes[Demo] = (
 (__ \ "customers").write[Seq[(String,Customer)]] and
 (__ \ "dummy").writeNullable[String]) { 
    (d: Demo) => (d.customers,d.dummy)
 }

}
Run Code Online (Sandbox Code Playgroud)

这是我得到的编译器错误:

No Json serializer found for type Seq[(String,models.health.Customer)]
Run Code Online (Sandbox Code Playgroud)

and*_*nka 12

库不会假设您希望元组如何序列化.你可以使用数组,对象等.

通过添加此隐式Writes函数,您的序列化程序将其作为数组写出.

  implicit def tuple2Writes[A, B](implicit a: Writes[A], b: Writes[B]): Writes[Tuple2[A, B]] = new Writes[Tuple2[A, B]] {
    def writes(tuple: Tuple2[A, B]) = JsArray(Seq(a.writes(tuple._1), b.writes(tuple._2)))
  }
Run Code Online (Sandbox Code Playgroud)

  • 如果您升级到 Play 2.6.1,则不必再执行此操作 - 他们对此用例有默认的序列化。 (2认同)