Scala Play:如何定义;Json可写类“;

Scala Play:如何定义;Json可写类“;,json,scala,playframework,playframework-2.5,Json,Scala,Playframework,Playframework 2.5,我想编写一个将案例类转换为Json的函数: import play.api.libs.json._ def myJson(cc: Product): JsValue = { Json.toJson(cc) // simplified } 每个案例类都有一个隐式的写入[T],例如: case class Test(a: Int) object Test { implicit val jsonWrites: Writes[Test] = Json.writes[Test] } 可以单

我想编写一个将案例类转换为Json的函数:

import play.api.libs.json._

def myJson(cc: Product): JsValue = {
  Json.toJson(cc)  // simplified
}
每个案例类都有一个隐式的
写入[T]
,例如:

case class Test(a: Int)
object Test {
  implicit val jsonWrites: Writes[Test] = Json.writes[Test]
}
可以单独编写
Json.toJson(新测试(1))
,但是上面的
myJson
函数无法编译,因为它永远不知道
cc
是否定义了隐式写操作

[如何编写函数签名,使其只需要具有
Writes
隐式的类?]

编辑:如何编写函数输入类型,使其仅对应于具有
Writes
隐式的类

我试过这个:

trait JsonWritableResult[T <: Product] {
  implicit val jsonWrites: Writes[T]
}

case class Test(a: Int)
object Test extends JsonWritableResult[Test] {
  implicit val jsonWrites: Writes[Test] = Json.writes[Test]
}

def myJson(cc: JsonWritableResult[_ <: Product]): JsValue = {
  Json.toJson(cc)
}

trait jsonwriteableresult[T类似这样的东西似乎会给你想要的行为

import play.api.libs.json.{JsValue, Json, Writes}

trait Product {}

case class Test(a: Int) extends Product
object Test {
  implicit val jsonWrites: Writes[Test] = Json.writes[Test]
}

def myJson[T <: Product](cc: T)(implicit writes: Writes[T]): JsValue = {
  Json.toJson(cc)  // simplified
}

import Test._

myJson(Test(3))
import play.api.libs.json.{JsValue,json,Writes}
特征积{}
案例类测试(a:Int)扩展了产品
对象测试{
隐式val jsonWrites:Writes[Test]=Json.Writes[Test]
}

def myJson[T类似的东西似乎可以为您提供所需的行为

import play.api.libs.json.{JsValue, Json, Writes}

trait Product {}

case class Test(a: Int) extends Product
object Test {
  implicit val jsonWrites: Writes[Test] = Json.writes[Test]
}

def myJson[T <: Product](cc: T)(implicit writes: Writes[T]): JsValue = {
  Json.toJson(cc)  // simplified
}

import Test._

myJson(Test(3))
import play.api.libs.json.{JsValue,json,Writes}
特征积{}
案例类测试(a:Int)扩展了产品
对象测试{
隐式val jsonWrites:Writes[Test]=Json.Writes[Test]
}

def myJson[T不是强制case类具有隐式,而是更聪明的做法是强制它使用或不使用case类中定义的隐式来重写trait中的
toJson
方法。更简单且有效。然后,我的工厂可以在其输出类型中显式显示此trait,因此我可以序列化它输出的任何内容


但是,由于另一个答案回答了我表述错误的问题,我接受它;)

而不是强制case类使用隐式,更聪明的做法是强制它从特性重写
到JSON
方法,使用或不使用case类中定义的隐式。更简单,而且它可以工作。然后我的工厂可以显式地它的输出类型是trait,因此我可以序列化它输出的任何内容


但是,既然另一个答案回答了我表述错误的问题,我接受它;)

为什么您希望自定义myJson函数用于任意case类?它与Json.toJson有什么不同?仅仅因为我有120个这样的case类,我不想编写120个控制器来返回那么多不同的Json结果。一个通用的nction最好。@Tyth注意它可能确实很愚蠢,但我还没有意识到)您只需要接受一个
(隐式写入:写入[t])
在你的
myJson
方法中。这意味着什么?你要求编译器检查提供的类型是否有
Writes
的实例,如果我理解得很好,那就是
Json.toJson
已经有的签名。我真正需要的是一个特征/类型,我可以将它提供给工厂的所有结果,以便它们e保证是
toJson
的有效参数。看起来问题问得不好:(为什么要为任意case类使用自定义myJson函数?它与Json.toJson有什么不同?因为我有120个这样的case类,我不想编写120个控制器来返回那么多不同的Json结果。最好使用泛型函数。@Tyth注意,它可能确实很愚蠢,但我还没有意识到这一点)您只需要接受一个
(隐式写入:写入[T])
在你的
myJson
方法中。这意味着什么?你要求编译器检查提供的类型是否有
Writes
的实例,如果我理解得很好,那就是
Json.toJson
已经有的签名。我真正需要的是一个特征/类型,我可以将它提供给工厂的所有结果,以便它们e保证是
toJson
的有效参数。看起来问题问得不好:(