所以我的项目中有两个课程
case class Item(id: Int, name: String)
和
case class Order(id: Int, items: List[Item])
我正在尝试为Order创建读写属性,但是我收到编译器错误说:
"找不到unapply或unapplySeq函数"
在我的控制器中,我有以下内容:
implicit val itemReads = Json.reads[Item] implicit val itemWrites = Json.writes[Item] implicit val listItemReads = Json.reads[List[Item]] implicit val listItemWrites = Json.writes[List[Item]]
代码工作的itemReads
和itemWrites
而不是底部的两个.谁能告诉我哪里出错了,我是Play框架的新手.
感谢您的时间.
" No unapply or unapplySeq function found
"错误是由这两个引起的:
implicit val listItemReads = Json.reads[List[Item]] implicit val listItemWrites = Json.writes[List[Item]]
把它们扔掉 正如Ende所说,Play知道如何处理列表.
但是,你需要Reads
和Writes
为Order
呢!既然你同时阅读和写作,最简单的方法是定义Format
一个混合的特征Reads
和Writes
特征.这应该工作:
case class Item(id: Int, name: String) object Item { implicit val format = Json.format[Item] } case class Order(id: Int, items: List[Item]) object Order { implicit val format = Json.format[Order] }
以上,排序很重要 ; Item
并且伴侣对象必须在之前Order
.
因此,一旦您拥有所需的所有隐式转换器,关键是使它们在控制器中正确可见.以上是一个解决方案,但还有其他方法,正如我在尝试做类似的事情后所学到的.
你实际上并不需要定义那两个含义,play已经知道如何处理列表:
scala> import play.api.libs.json._ import play.api.libs.json._ scala> case class Item(id: Int, name: String) defined class Item scala> case class Order(id: Int, items: List[Item]) defined class Order scala> implicit val itemReads = Json.reads[Item] itemReads: play.api.libs.json.Reads[Item] = play.api.libs.json.Reads$$anon$8@478fdbc9 scala> implicit val itemWrites = Json.writes[Item] itemWrites: play.api.libs.json.OWrites[Item] = play.api.libs.json.OWrites$$anon$2@26de09b8 scala> Json.toJson(List(Item(1, ""), Item(2, ""))) res0: play.api.libs.json.JsValue = [{"id":1,"name":""},{"id":2,"name":""}] scala> Json.toJson(Order(10, List(Item(1, ""), Item(2, "")))) res1: play.api.libs.json.JsValue = {"id":10,"items":[{"id":1,"name":""},{"id":2,"name":""}]}
您看到的错误可能是因为Play使用unapply方法为您的读/写构造宏扩展,并且List
是一个抽象类,play-json需要具体类型才能使宏工作.